0

我想为我的表创建一个触发器table_master

的表模式table_master很简单:

master_id       INT(11)       AUTO_INCREMENT, PRIMARY, NOT NULL
title           VARCHAR(50)   NOT NULL

这是另一个关系表rel_master_another_tbl

master_id       INT(11)       PRIMARY, NOT NULL
another_id      INT(11)       PRIMARY, NOT NULL

我想要实现的是,当在DELETE上发出查询时table_master,触发器会检查是否master_idrel_master_another_tbl. 更新:如果是,回滚/取消DELETE查询。

我怎样才能做到这一点?

CREATE TRIGGER check_before_delete BEFORE DELETE ON table_master
// what should I put here?
END;
4

2 回答 2

1

您尝试实现的行为已经存在于数据库中,可以通过ON DELETE RESTRICT触发器使用。定义表以利用这一点的示例如下所示:

CREATE TABLE `master` (
    `master_id` int(11) NOT NULL AUTO_INCREMENT,
    `title` varchar(50) DEFAULT NULL,
    PRIMARY KEY (`master_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `rel_master_another_tbl` (
    `master_id` int(11) NOT NULL,
    `another_id` int(11) NOT NULL,
    KEY `i_master_id` (`master_id`),
    FOREIGN KEY `fk_rel_master_another_tbl_master` (`master_id`)
        REFERENCES `master` (`id`) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

RESTRICTmaster在这种情况下,如果您的表中有相应的行rel_master_another_tbl引用了 master id 列,则尝试从表中删除行将失败。另外,请注意这是外键和触发器RESTRICT的默认选项,因此您实际上可以如下所示定义外键,并且它的功能仍然相同:ON DELETEON UPDATE

FOREIGN KEY `fk_rel_master_another_tbl_master` (`master_id`)
    REFERENCES `master` (`id`)

有关更多信息,请参阅有关外键约束的 MySQL 文档。

于 2012-12-20T07:44:21.903 回答
0

如果你想检查这个 id 是否存在于另一个表中,那么你可以这样做:

DELIMITER $$

CREATE TRIGGER check_before_delete BEFORE DELETE ON table_master
FOR EACH ROW
BEGIN

DECLARE has_row TINYINT;

SELECT 1
INTO has_row
FROM rel_master_another_tbl
WHERE master_id = OLD.master_id;

IF has_row IS NOT NULL THEN
// PUT YOUR CODE HERE
END IF;

END$$

但是,请查看 Perception 关于在表之间设置键约束和使用ON DELETE RESTRICT触发器的评论,因为这可能是您问题的正确解决方案。

于 2012-12-20T06:50:04.523 回答