在事务中的记录之间交换索引

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