我想为我的表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_id中是否使用了rel_master_another_tbl。更新:如果是,请回滚/取消DELETE查询。

我该如何实现?

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

最佳答案

您尝试实现的行为已存在于数据库中,可以通过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;


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

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


有关更多信息,请参考foreign key constraints上的MySQL文档。

关于mysql - MySQL触发器:检查主键ID是否在其他表中使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13966610/

10-16 16:38