基本上,复合主键错误“UNIQUE约束失败”的下一步是:我在插入后创建了一个触发器,如果它小于一,则将其设置SEQ
为最高加一。SEQ
基本上:
CREATE TRIGGER TRG_NAMES_ADD2 AFTER INSERT ON NAMES FOR EACH ROW
WHEN NEW.SEQ < 1
BEGIN
UPDATE NAMES SET
SEQ = (SELECT IFNULL(MAX(SEQ), 0) + 1 FROM NAMES WHERE TYPE = NEW.TYPE)
WHERE TYPE = NEW.TYPE AND SEQ = NEW.SEQ;
END;
不过,我想TYPE
独立于做同样的事情SEQ
。我发现的问题是每个触发器只能有一个UPDATE
,并且AFTER INSERT
触发器可以按任何顺序执行。
我尝试了第二个触发器,如下所示:
CREATE TRIGGER TRG_NAMES_ADD1 AFTER INSERT ON NAMES FOR EACH ROW
WHEN NEW.TYPE < 1
BEGIN
UPDATE NAMES SET
TYPE = (SELECT IFNULL(MAX(TYPE), 0) + 1 FROM NAMES),
SEQ = 1
WHERE TYPE = NEW.TYPE AND SEQ = NEW.SEQ;
END;
但是为了完整性,TRG_NAMES_ADD2
应该在 后运行TRG_NAMES_ADD1
,否则我必须将两个操作(设置TYPE
为可能的新值(如果< 1),然后使用该新值也可能为SEQ
(如果< 1)设置新值)放入一个触发器。
不幸的是,这超出了我的能力范围。
为了方便起见,这里是表创建和一些示例插入:
CREATE TABLE NAMES (
TYPE INTEGER NOT NULL, SEQ INTEGER NOT NULL, NAME VARCHAR(20),
PRIMARY KEY (TYPE, SEQ)
);
insert into NAMES (type, seq, name) values (2, 3, "T1");
insert into NAMES (type, seq, name) values (2, 0, "T2");
insert into NAMES (type, seq, name) values (2, 0, "T3");
insert into NAMES (type, seq, name) values (0, 1, "T4");
insert into NAMES (type, seq, name) values (0, 0, "T5");
所以任务应该是这样的:
T|S|N
-----
2|3|T1 # T,S set manually
2|4|T2 # S set automatically
2|5|T3 # S set automatically
3|1|T4 # T set automatically
4|1|T5 # T,S set automatically
您确定每个触发器只能有一个更新吗?我在 sqlite 文档中没有找到任何对此限制的引用。
无论如何,您可以将这两个更新合并到一个更新中: