如何临时中断SQLite中的列唯一性?

如何临时中断SQLite中的列唯一性?,sqlite,sql-update,unique,Sqlite,Sql Update,Unique,我有一张简单的桌子: CREATE TABLE ChecklistStep ( Checklist INTEGER REFERENCES Checklist (Id), Id INTEGER PRIMARY KEY AUTOINCREMENT, StepIndex INTEGER NOT NULL, Name VARCHAR NOT NULL, UNIQUE (Checklist, StepIndex)); 现在我想交换两

我有一张简单的桌子:

CREATE TABLE ChecklistStep (
    Checklist INTEGER REFERENCES Checklist (Id), 
    Id        INTEGER PRIMARY KEY AUTOINCREMENT, 
    StepIndex INTEGER NOT NULL, 
    Name      VARCHAR NOT NULL, 
    UNIQUE (Checklist, StepIndex));
现在我想交换两个项目的索引。这样做,我暂时打破了这一对的唯一性(检查表、步骤索引)。我希望,我可以在事务中做到这一点,这样在提交后,所有约束都将保留,但这不起作用:

begin transaction;
update ChecklistStep set StepIndex = 0 where id = 6;
update ChecklistStep set StepIndex = 1 where id = 5;
commit transaction;
原因:

UNIQUE constraint failed: ChecklistStep.Checklist, ChecklistStep.StepIndex

如何编写这样的更新?

SQLite没有延迟的唯一约束

此处不起作用,因为如果在不更新索引的情况下更改表,内部索引将损坏

唯一的方法是使用保证未使用的临时值:

begin;
update ChecklistStep set StepIndex = -99999999 where id = 6;
update ChecklistStep set StepIndex = 1 where id = 5;
update ChecklistStep set StepIndex = 0 where id = 6;
commit;

通常情况下,您会删除/添加约束,但不能使用SQLite,请参阅,为了使内容更清晰,我还将使列可为null,并使用null而不是任何值。感谢您的回答,我想这是唯一可行的选项。@Spook如果您使列可为NULL并添加对NULL的检查,您可以使用
PRAGMA ignore\u CHECK\u constraints=ON
,暂时关闭检查约束,然后再次打开约束,然后可能
PRAGMA quick\u CHECK
(不确定通过重新启用检查是否暗示了这一点)