我正在尝试创建一个名为UndeleteU2Track的触发器。此触发器的目的是取消从Track表中删除与艺术家为U2的专辑相关联的任何曲目的效果。关键是触发器不会停止删除,但它通过重新创建完全相同的一行或多行已删除的轨道或轨道来取消其效果。此外,触发器忽略删除与U2无关的轨道
这是我的代码:
CREATE TRIGGER UndeleteU2Track BEFORE DELETE ON Track
BEGIN
SELECT CASE
WHEN OLD.TrackID IN (
SELECT t.TrackID
FROM Track AS t, Album AS a
WHERE t.AlbumID == a.AlbumID AND a.ArtistID ==
(SELECT ArtistID From Artist WHERE Name == "U2"))
THEN
INSERT INTO Track Values
(OLD.TrackID, OLD.Name, OLD.AlbumID, OLD.MediaTypeID,
OlD.GenreID, OLD.Composer, OLD.Millisecond, OLD.Byte, OLD.UnitPrice);
END;
END;
我遇到了语法错误。
答案 0 :(得分:1)
而不是编写或更正你的SQL(因为它需要我在我的数据库中创建表,而我没有SQL),我会给你指点,因为我相信你的方法是错误的。
如果执行此触发器“BEFORE DELETE”并且TrackId是主键或唯一键,则此插入将失败,因为记住该记录尚未删除。所以它必须是AFTER DELETE。
可以使用删除前触发器,如果存在U2记录(如示例所示),可能会引发自定义异常以中止删除操作。
SIGNAL SQLSTATE ='45000' SET MESSAGE_TEXT ='CANNOT DELETE THIS RECORD'
E.g。
IF NOT EXISTS
( SELECT t.TrackID FROM Track AS t, Album AS a WHERE t.AlbumID = a.AlbumID AND a.ArtistID IN
(SELECT ArtistID From Artist WHERE `Name` = 'U2')
) THEN
DELETE FROM TRACK WHERE TRACKID=p_TrackId;
END IF;