0

我正在尝试响应在一个表 (A) 中插入一行,以根据第三个表 (C) 的值(可以连接到第一个表)在第二个表 (B) 中创建或更新多行.

我有以下构造,

CREATE TRIGGER MyTrigger AFTER INSERT ON A
    BEGIN
        INSERT OR REPLACE INTO B (ID, T1, T2, Role)
        VALUES
        (
            ( SELECT ID FROM C WHERE R1 = NEW.R1 ),
            NEW.T1,
            B.T2, -- The existing row's T2
            ( SELECT Role FROM C WHERE R1 = NEW.R1 ),
        )
    END;

Table A has columns ID, T1, R1
Table B has columns ID, T1, T2, Role
Table C has columns ID, R1, R2, Role

我在尝试编写触发器时至少有两个问题

  1. 我不知道如何在 REPLACE 案例中引用 B 的现有值,因此是“B.T2”
  2. 在表 B 中执行 INSERT/REPLACE 时,我不知道如何从表 C 的同一行中引用多个列(R1、Role)。

感谢您帮助解决这个问题。

4

3 回答 3

1

使用SELECT而不是VALUES

CREATE TRIGGER MyTrigger AFTER INSERT ON A BEGIN
    INSERT OR REPLACE INTO B (ID, T1, T2, Role) SELECT
        (SELECT ID FROM C WHERE R1 = NEW.R1),
        NEW.T1,
        B.T2,
        (SELECT Role FROM C WHERE R1 = NEW.R1)
        FROM B WHERE ROWID=NEW.ROWID
    END;
于 2013-10-29T17:55:24.127 回答
1

我能够在 SELECT 上使用 LEFT OUTER JOIN 以便可以命名所有需要的值,而不管是否存在现有行。

CREATE TRIGGER MyTrigger AFTER INSERT ON A
    BEGIN
        INSERT OR REPLACE INTO B (ID, T1, T2, Role)
            SELECT
                C.ID,
                NEW.T1,
                B.T2,
                C.Role
            FROM C LEFT OUTER JOIN B ON C.ID = B.ID WHERE C.R1 = NEW.R1;
    END;
于 2013-10-30T12:29:12.137 回答
0

要查找B记录,只需像使用C. 要搜索的B.ID值与您尝试插入的值相同。

CREATE TRIGGER MyTrigger
AFTER INSERT ON A
BEGIN
    INSERT OR REPLACE INTO B (ID, T1, T2, Role)
    VALUES
    (
        ( SELECT ID FROM C WHERE R1 = NEW.R1 ),
        NEW.T1,
        ( SELECT T2 FROM B WHERE ID = ( SELECT ID FROM C WHERE R1 = NEW.R1 ) ),
        ( SELECT Role FROM C WHERE R1 = NEW.R1 )
    );
END;
于 2013-10-29T20:06:40.193 回答