在事务中的记录之间交换索引
Swapping indexes between records within a transaction
我遇到了 IndexedDB 的问题。我想交换一个事务中所有记录之间的唯一索引之一,但事务失败,因为记录的唯一约束被违反。这对我来说很奇怪,因为在那次交易中我重写了被违反的索引。
这是 IndexedDB 的缺点还是我做错了什么?
这是一个例子:
起始索引:
[
{
id: 1,
id2: 1
},
{
id: 2,
id2: 2
},
{
id: 3,
id2: 3
},
{
id: 4,
id2: 4
}
]
变异指数:
[
{
id: 1,
id2: 4
},
{
id: 2,
id2: 3
},
{
id: 3,
id2: 2
},
{
id: 4,
id2: 1
}
]
交易将失败,因为 id
上的 id2
不是唯一的,因为 id
4 已经将其 id2
设置为 4。
唯一性约束应用于每个单独的请求,而不仅仅是在整个事务提交时。所以,例如:
var store = db.createObjectStore('s', {keyPath: id});
store.createIndex('by_idxid', 'idxid', {unique: true});
store.put({id: 1, idxid: 1111});
store.put({id: 2, idxid: 2222});
...
var tx = db.transaction('s', 'readwrite');
var store = tx.objectStore('s');
store.put({id: 1, idxid: 2222}); // this request will fail
store.put({id: 2, idxid: 1111});
您需要先删除记录,例如:
store.delete(2);
store.put({id: 1, idxid: 2222});
store.put({id: 2, idxid: 1111});
我遇到了 IndexedDB 的问题。我想交换一个事务中所有记录之间的唯一索引之一,但事务失败,因为记录的唯一约束被违反。这对我来说很奇怪,因为在那次交易中我重写了被违反的索引。
这是 IndexedDB 的缺点还是我做错了什么?
这是一个例子:
起始索引:
[
{
id: 1,
id2: 1
},
{
id: 2,
id2: 2
},
{
id: 3,
id2: 3
},
{
id: 4,
id2: 4
}
]
变异指数:
[
{
id: 1,
id2: 4
},
{
id: 2,
id2: 3
},
{
id: 3,
id2: 2
},
{
id: 4,
id2: 1
}
]
交易将失败,因为 id
上的 id2
不是唯一的,因为 id
4 已经将其 id2
设置为 4。
唯一性约束应用于每个单独的请求,而不仅仅是在整个事务提交时。所以,例如:
var store = db.createObjectStore('s', {keyPath: id});
store.createIndex('by_idxid', 'idxid', {unique: true});
store.put({id: 1, idxid: 1111});
store.put({id: 2, idxid: 2222});
...
var tx = db.transaction('s', 'readwrite');
var store = tx.objectStore('s');
store.put({id: 1, idxid: 2222}); // this request will fail
store.put({id: 2, idxid: 1111});
您需要先删除记录,例如:
store.delete(2);
store.put({id: 1, idxid: 2222});
store.put({id: 2, idxid: 1111});