【发布时间】:2019-10-10 05:10:29
【问题描述】:
我想为现有表添加一个额外的唯一约束。 This 和其他答案说使用 sqlite 是不可能的,并建议创建一个唯一索引:
ALTER TABLE example ADD COLUMN new_unique TEXT;
CREATE UNIQUE INDEX new_unique_index ON example(new_unique);
这似乎有效。但是,我遇到了UPSERTs 的问题:
INSERT INTO example (foo, old_unique, new_unique) VALUES ('foo', 'old', 'new') ON CONFLICT(old_unique, new_unique) DO UPDATE SET foo='foo';
这给出了一个错误:
ON CONFLICT cause does not match any PRIMARY KEY or UNIQUE constraint
有什么办法可以调整上述语句的ON CONFLICT 子句以使用新的“约束”?
我尝试使用new_unique_index,但无济于事。如果不可能,是否有任何替代方法可以创建具有新唯一约束的新表并将旧表中的值复制到新约束列为 NULL 的新表中?这会很麻烦。我想我可以创建一个新表,其中包含前者的所有列,除了旧的唯一列,加上新的唯一列,并以某种方式链接它们,但这听起来很乱,我不知道如何继续。
最小可重现示例:
CREATE TABLE example (foo TEXT, old_unique TEXT, UNIQUE(old_unique));
ALTER TABLE example ADD COLUMN new_unique TEXT;
CREATE UNIQUE INDEX new_unique_index ON example(new_unique);
INSERT INTO example (foo, old_unique, new_unique) VALUES ('foo', 'old', 'new') ON CONFLICT(old_unique, new_unique) DO UPDATE SET foo='foo';
【问题讨论】:
标签: sqlite