0

我想创建的 sqlite3 触发器可能用 sql 实现,也可能不可用。涉及五个表:

Members               Groups                  GroupMembers      Accounts       
mId |name| accId      gId | name | accId      gId | mId         accId | balance

Orders
oId | accId | ammount

当有人删除一个群组时,我想以群组余额的平均值为每个群组成员下订单。所以它应该做这样的事情:

CREATE NEW TRIGGER triggername 
BEFORE DELETE ON Groups
WHEN ((SELECT balance FROM Accounts WHERE accId=OLD.accId) = 0)
FOR EACH ROW IN 
(SELECT accId 
FROM GroupMembers JOIN Members ON GroupMembers.mId = Members.mId 
WHERE GroupMembers.gId = OLD.gId)
BEGIN
INSERT INTO Orders(accId,ammount) VALUES(accId, 
(SELECT balance FROM Accounts WHERE accId = OLD.accId)
 / 
(SELECT SUM(mId) FROM GroupMembers WHERE gId = OLD.gId)
);
END

问题是:是否可以在触发器应用的表之外的任何其他表中创建 FOR EACH ROW?是否可以将 WHEN 语句放在 FOR EACH 语句之前?

4

1 回答 1

0

正如所记录的那样,没有FOR EACH ROW IN ...条款这样的东西。

但是,INSERT语句可以使用SELECT语句作为要插入的数据的来源。编写一个SELECT语句,为每个组成员返回一行:

CREATE TRIGGER triggername
AFTER DELETE ON Groups
FOR EACH ROW
BEGIN
    INSERT INTO Orders(accId, amount)
    SELECT accId,
           (SELECT balance
            FROM Accounts
            WHERE accId = OLD.accId) /
           (SELECT COUNT(*)
            FROM GroupMembers
            WHERE gId = OLD.gId)
    FROM Members
    WHERE mId IN (SELECT mId
                  FROM GroupMembers
                  WHERE gId = OLD.gId);
END;

(我掉了balance = 0过滤器。)

于 2013-05-25T20:09:27.557 回答