尝试将外键与触发器结合使用

时间:2013-09-30 22:03:38

标签: mysql triggers relation mariadb

删除某些行和关系时,我在清理数据库时遇到问题。

CREATE TABLE IF NOT EXISTS `cms_users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `first_name` varchar(50) DEFAULT NULL,
  `last_name` varchar(50) DEFAULT NULL,
  `id_account_type` smallint(2) unsigned NOT NULL,
  PRIMARY KEY (`id`)
);

以上是一些用户。这些用户有孩子,他们存储在其他表中:

CREATE TABLE IF NOT EXISTS `cms_users_relations` (
  `id_user` int(10) unsigned NOT NULL,
  `id_parent` int(10) unsigned DEFAULT NULL,
  UNIQUE KEY `id_user` (`id_user`),
  KEY `constraint_9` (`id_parent`)
);


ALTER TABLE `cms_users_relations`
  ADD CONSTRAINT `constraint_8` FOREIGN KEY (`id_user`) REFERENCES `cms_users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `constraint_9` FOREIGN KEY (`id_parent`) REFERENCES `cms_users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

问题在于,当我从cms_users中删除父项时,所有子项都应该被删除但是它们不会被删除。我为此目的创建了一个triger,但它没有完成这项工作:

DELIMITER //
CREATE TRIGGER `delete_user` AFTER DELETE ON `cms_users_relations`
 FOR EACH ROW BEGIN 
  DELETE FROM cms_users WHERE OLD.id_user = cms_users.id; 
 END
//
DELIMITER ;

看起来mysql服务器不打扰我们删除用户,然后通过外键删除关系然后我们应该触发...

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

该触发器应在cms_users表上创建,而不是在cms_users_relations上创建,然后在cms_users_relations上删除,如下所示:

DELIMITER //
CREATE TRIGGER `delete_user` AFTER DELETE ON `cms_users`
 FOR EACH ROW BEGIN 
  DELETE FROM cms_users_relations WHERE OLD.id_user = cms_users_relations.id; 
 END
//
DELIMITER ;

trigger是您在cms_users中对父项进行的删除,因此您可以在此处创建它。


我只看了你如何创建你的触发器,但错过了你所做的部分:

ALTER TABLE `cms_users_relations`
  ADD CONSTRAINT `constraint_8` FOREIGN KEY (`id_user`) REFERENCES `cms_users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `constraint_9` FOREIGN KEY (`id_parent`) REFERENCES `cms_users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

使用它,您不需要创建触发器来删除cms_users关系上的元素。

请参阅this fiddle以查看其是否有效。

您可能需要查看at the answers on this question,看看您可能会有什么不同,以免发生这种情况。