首页 > 解决方案 > 将查询值检索到触发器正文中

问题描述

假设您有以下两个表:

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。谢谢你。

标签: mysqlsqltriggers

解决方案


问题是,我如何检索“photoId=1”

在触发器内部,您要检索正确的 photoId 和 1 只是您的示例。

在您的案例中使用:OLD.photoID(即实际的)


推荐阅读