3

我正在尝试使用以下示例在违反B时将重复数据插入表中:PKABEFORE 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)

我收到另一条错误消息:

UNIQUE 约束失败:A.Col、A.Col

虽然它不应该因为ON CONFLICT IGNORE.

  • 为什么我会收到这些错误消息?(是什么原因)。
  • 如何使用触发器将重复项插入另一个表?
4

1 回答 1

1

您不需要索引:

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是否已包含列值与要插入的列值相同的行,如果包含,则将新行插入 table 中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;
于 2020-09-18T14:08:58.923 回答