我想为我的表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 DELETE
和ON 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/