Jat*_*ing 12 mysql triggers sql-delete
我读过这篇文章,但它似乎不适用于删除.尝试创建触发器时出现此错误:
在服务器中执行SQL脚本
错误:错误1363:DELETE触发器中没有新行
CREATE TRIGGER DeviceCatalog_PreventDeletion
BEFORE DELETE on DeviceCatalog
FOR EACH ROW
BEGIN
DECLARE dummy INT;
IF old.id = 1 or old.id =2 THEN
SELECT * FROM DeviceCatalog WHERE DeviceCatalog.id=NEW.id;
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
SQL脚本执行完成:语句:4成功,1失败
Dev*_*art 18
尝试这样的事情 -
DELIMITER $$
CREATE TRIGGER trigger1
BEFORE DELETE
ON table1
FOR EACH ROW
BEGIN
IF OLD.id = 1 THEN -- Abort when trying to remove this record
CALL cannot_delete_error; -- raise an error to prevent deleting from the table
END IF;
END
$$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
mat*_*elo 16
使用@MathewFoscarini关于MySQL SIGNAL Command的评论来改进@ Devart的(已接受)答案,而不是通过调用不存在的过程引发错误,您可以发出自定义错误消息的信号.
DELIMITER $$
CREATE TRIGGER DeviceCatalog_PreventDeletion
BEFORE DELETE ON DeviceCatalog
FOR EACH ROW
BEGIN
IF old.id IN (1,2) THEN -- Will only abort deletion for specified IDs
SIGNAL SQLSTATE '45000' -- "unhandled user-defined exception"
-- Here comes your custom error message that will be returned by MySQL
SET MESSAGE_TEXT = 'This record is sacred! You are not allowed to remove it!!';
END IF;
END
$$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
选择SQLSTATE 45000作为MySQL的参考手册建议:
要发信号通用SQLSTATE值,请使用"45000",表示"未处理的用户定义的异常".
这样,您的自定义信息将被显示时,它会尝试删除记录ID的用户1或2.此外,如果不应从表中删除任何记录,则可以删除IF .. THEN和END IF;行.这样可以防止在表上删除任何记录.
好吧,错误消息非常清楚地告诉你:在DELETE触发器中没有新的.
在DELETE中使用NEW是没有意义的,就像INSERT中的OLD没有意义一样.
| 归档时间: |
|
| 查看次数: |
13932 次 |
| 最近记录: |