繁体   English   中英

Mysql 在删除时创建触发器时出现语法错误

[英]Mysql syntax error when creating trigger on delete

我在数据库中创建触发器时遇到问题。 这个想法是,当从播放列表中删除一首歌曲时,相应的行会从表playlistcancion中删除。 触发器的想法是它从播放列表的总时间中删除已删除歌曲的时间。

view name: pycs (shows songs of corresponding playlists)
column name | SongID | playlistID | Playlist | songName | Duration
data type   | INT    | INT        | varchar  | varchar  | TIME 

table name: playlistcancion (keeps track of which songs are in which playlists)
column name | songID | playlistID 
data type   | INT    | INT   

table name: playlists (playlist data and creators userID)
column name | playlistID| userID  | Followers  | Title  | TotalDuration
data type   | INT       | INT     | INT        | varchar| TIME 

这是我的触发器查询:

CREATE TRIGGER remove_time
AFTER DELETE ON playlistcancion
FOR EACH ROW 
    DECLARE dur TIME;
    SELECT Duration INTO dur FROM pycs WHERE playlistID = OLD.playlistID AND songID = OLD.songID;
    UPDATE playlists SET TotalDuration = SEC_TO_TIME(TIME_TO_SEC(TotalDuration) - TIME_TO_SEC(dur))
    WHERE playlistID = OLD.playlistID;

我得到的错误是:MySQL 说:#1064 - 'DECLARE dur TIME; 附近的语法有问题; SELECT Duration INTO dur FROM pycs WHERE playlisID = OLD.pla' 在第 1 行我使用 phpMyAdmin 创建触发器。 提前致谢。

添加 BEGIN 和 END 解决了您遇到的错误。

CREATE TRIGGER remove_time
AFTER DELETE ON playlistcancion
FOR EACH ROW BEGIN
    DECLARE dur TIME;
    SELECT Duration INTO dur FROM pycs WHERE playlistID = OLD.playlistID AND songID = OLD.songID;
    UPDATE playlists SET TotalDuration = SEC_TO_TIME(TIME_TO_SEC(TotalDuration) - TIME_TO_SEC(dur))
    WHERE playlistID = OLD.playlistID;
    END;

如果您遇到更多问题,最好使用触发器中涉及的所有表的插入脚本发布。

将您的触发器组合成单语句形式:

CREATE TRIGGER remove_time
AFTER DELETE 
ON playlistcancion
FOR EACH ROW 
UPDATE playlists 
SET TotalDuration = SEC_TO_TIME(   TIME_TO_SEC(TotalDuration) 
                                 - TIME_TO_SEC(SELECT Duration 
                                               FROM pycs 
                                               WHERE playlistID = OLD.playlistID 
                                                 AND songID = OLD.songID))
WHERE playlistID = OLD.playlistID;

现在它不需要在中间变量、BEGIN-END 块和 DELIMITER 中重新分配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM