如何解决插入触发器之前的SQLite
当尝试使用B
违反PKA
时,我试图将重复数据插入表BEFORE INSERT TRIGGER
中,如下例所示:
CREATE TABLE A( Col INTEGER,Coll TEXT(25),CONSTRAINT PKA PRIMARY KEY(Col,Coll) ON CONFLICT IGnorE);
CREATE UNIQUE INDEX IX_A ON A(Col,Coll);
CREATE TABLE B( Col INTEGER,Coll TEXT(25));
CREATE INDEX IX_B ON B(Col,Coll);
CREATE TRIGGER Trig
BEFORE INSERT
ON A
WHEN (Col = New.Col AND Coll = New.Coll)
BEGIN
INSERT INTO B(Col,Coll) VALUES(New.Col,New.Coll);
END;
但是,似乎Col
列无法在此处访问,因此它抛出:
没有这样的列:Col
即使我将条件更改为
New.Col IN(SELECT Col FROM A)
AND
New.Coll IN(SELECT Coll FROM A)
我又收到一条错误消息:
唯一约束失败:A.Col,A.Coll
不是因为ON CONFLICT IGnorE
而引起的。
解决方法
您不需要索引:
CREATE UNIQUE INDEX IX_A ON A(Col,Coll);
因为您已经将(Col,Coll)
定义为PRIMARY KEY
,并且使用此索引,尽管您为重复的行定义了ON CONFLICT IGNORE
,但是如果尝试将其定义为插入重复的行,因为未为索引定义ON CONFLICT IGNORE
。
所以放下它:
DROP INDEX IF EXISTS IX_A;
现在,将触发器的代码更改为此:
CREATE TRIGGER Trig
BEFORE INSERT
ON A
WHEN EXISTS (SELECT 1 FROM A WHERE Col = New.Col AND Coll = New.Coll)
BEGIN
INSERT INTO B(Col,Coll) VALUES(New.Col,New.Coll);
END;
EXISTS
检查表A
是否已包含一行且其列值与要插入的列值相同的行,如果已经包含,则将新行插入表B
中。
您还可以这样编写触发器:
CREATE TRIGGER Trig
BEFORE INSERT
ON A
BEGIN
INSERT INTO B(Col,Coll)
SELECT Col,Coll FROM A
WHERE (Col,Coll) = (New.Col,New.Coll);
END;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。