约束错误:键已经存在于对象存储中。

7

我正在使用 React 16.3.2Redux 4Dexie 2.0.3 进行开发。

当我尝试第二次存储数据时,会抛出以下错误信息:

Error: ConstraintError: Key already exists in the object store.

   return dispatch => {
        db.table
        .add(data)
        .then (function(id){
            console.log(id)
        })
        .catch (function (error) {
            console.log("Error: " + error);
        });
    }

我的数据库结构:

   const db = new Dexie('ReactReduxDexieJsCRUD');
  db.version(1).stores({table:'++id,name,age,bloodGroup,donateBefore,weight' });

第一次存储日期时,它能够正常工作,但之后会出现错误。

2
尝试使用put(data)代替add(data) - Oblosys
可爱的评论 #Oblosys和#stolex,但它会创建另一个问题,它不更改ID,而且它的工作方式就像数据库中的#update。 - MD Ashik
@smith 我不想使用重复的键。为什么它会给我重复键错误?我第二次提交了带有新值的表单,所以应该将新数据存储为新ID吗? - MD Ashik
第二次,升华重复的键,你想发生什么? - user9487972
第二、第三……它将把数据存储在本地的indexDB数据库中。不断地向数据库插入数据。 - MD Ashik
显示剩余3条评论
1个回答

8
你的数据库模式是怎样的?(db.version(x).stores({...}) 这部分是什么意思?)
最常见的情况是采用入站主键,例如:
db.version(1).stores({
  table: 'id, idx1, idx2...'
});

这里的id是主键。
  • db.table.add({id: 1, foo: 'bar'})将添加带有id 1的对象。
  • db.table.add({id: 1, foo: 'bar2'})第二次会失败,因为id 1已经存在。
  • db.table.put({id: 1, foo: 'bar2'})将更新id为1的对象。
所以你真正想做什么?你说你想添加一个新的具有新的键的对象。如果是这样,我想错误是你第二次给出相同的键。
你也可以让数据库生成id。
db.version(2).stores({
  table: '++id, idx1, idx2...'
});

接着,您在调用add()时无需提供id:

  • db.table.add({foo: 'bar'}) 将添加一个带有id 1的对象。
  • db.table.add({foo: 'barX'}) 第二次将添加一个带有id 2的新对象。
  • ...

谢谢,David。这是我需要的完美答案。 - MD Ashik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接