Javascript ConstraintError:对象存储中已存在密钥

Javascript ConstraintError:对象存储中已存在密钥,javascript,redux,indexeddb,dexie,Javascript,Redux,Indexeddb,Dexie,我正在使用React 16.3.2、Redux 4和Dexie 2.0.3 当我第二次存储数据时,它会抛出此错误消息 错误:约束错误:对象存储中已存在密钥。 return dispatch => { db.table .add(data) .then (function(id){ console.log(id) }) .catch (function (error) {

我正在使用React 16.3.2、Redux 4和Dexie 2.0.3

当我第二次存储数据时,它会抛出此错误消息

错误:
约束错误:对象存储中已存在密钥。

   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' });

第一次很好地存储日期,但在它给出错误之后

您的模式是什么样子的?(部件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'})
    2次将失败,因为id 1存在
  • db.table.put({id:1,foo:'bar2'})
    将用id 1更新对象
那么你真正想做什么呢?你说你想用新的键添加新对象。如果是这样,我想错误是你第二次给了相同的键

您还可以让db生成id

db.version(2).stores({
  table: '++id, idx1, idx2...'
});
那么您就不需要在add()的调用中提供id:

  • db.table.add({foo:'bar'})
    将添加id为1的对象
  • db.table.add({foo:'barX'})
    2次将添加id为2的新obj

尝试
put(data)
而不是
add(data)
。我没有使用Dexie,但MySql上的类似问题可以通过“在重复密钥更新时”解决。如果要在第二次调用时将新数据添加为新记录,则需要将表键设置为自动递增,或手动将新键指定为
add
call的第二个参数。如果要添加数据或更新数据(如果存在),请尝试[而不是添加。可爱的注释#Oblosys&#stolex但它会产生另一个问题它不会更改ID,它的工作原理类似于#数据库中的更新如预期的那样工作,但您不希望更新,那么当使用重复密钥时,您实际希望发生什么情况?@smith我不想使用重复密钥。为什么它会给我错误duplicate密钥。我从第二次提交时就使用了新值,所以应该使用新ID存储新数据?谢谢,#David,这是我需要的完美答案。