Триггер вставьте другой ряд
Триггер 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?
1 ответ
Как документально подтверждено, не существует такой вещи, как 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
фильтр.)