簡體   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