mysql - 将查询值检索到触发器正文中
问题描述
假设您有以下两个表:
CREATE TABLE Photos
(
photoId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title TEXT(500) NOT NULL,
visibilityId INT NOT NULL
);
CREATE TABLE Comments
(
commentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
comment TEXT(1000),
photoId INT DEFAULT NULL,
FOREIGN KEY (photoId) REFERENCES Photos (photoId)
ON DELETE CASCADE ON UPDATE CASCADE
);
如您所见,它们之间存在关系,因为comments.photoId
是 table 的外键Photos
。
有人试图删除一张有评论的照片(假设 photoId=1 至少有一条评论):
DELETE FROM Photos
WHERE photoId = 1
假设不能删除带有评论的照片。我想用这样的触发器来实现这个规则:
DELIMITER //
CREATE OR REPLACE TRIGGER triggerCheckDeletePhoto
BEFORE DELETE ON Photos
FOR EACH ROW
BEGIN
DECLARE comments INT;
SET comments = (SELECT COUNT(*) FROM Comments WHERE comments.photoId=PhotoId_from_query);
IF (comments > 0) THEN
SIGNAL SQLSTATE '45000' SET message_text = 'A commented photo cannot be deleted';
END IF;
END//
DELIMITER ;
问题是,如何在触发器中检索“photoId=1”。就像new.photoId
这是一个BEFORE INSERT ON
触发器。
我知道这可以在评论表中定义外键时实现,但是这里要求的方法将服务于外键不可能的其他目的。我正在使用 MariaDB。谢谢你。
解决方案
问题是,我如何检索“photoId=1”
在触发器内部,您要检索正确的 photoId 和 1 只是您的示例。
在您的案例中使用:OLD.photoID(即实际的)
推荐阅读
- amazon-web-services - Gmail API 身份验证重定向在 AWS EC2 上不起作用
- android - SharedPreference 记住复选框是可见和选中的
- ios - TableView中的动态collectionView
- html - 为什么我的文字周围有空白?它不在 freecodecamp 示例中。非常基础的 CSS/HTML
- r - 闪亮的搜索输入
- python - 从列表中访问元素?
- java - 如何在 Java 11 中设置 HashMap final 的键值对?
- python - 烧瓶运行没有运行并给我错误
- ffmpeg - ffmpeg 桌面捕获会丢弃音频帧但不会丢弃视频
- javascript - JavaScript es 6 将 Map 转换为 json 对象数组