SQLite触发器插入/替换多行多个表

时间:2013-10-29 17:35:10

标签: sqlite triggers

我正在尝试响应在一个表(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)。
  3. 感谢您对此进行整理的任何帮助。

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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;

答案 2 :(得分: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;