2

一部の行とリレーションが削除されたときにデータベースをクリーンアップする際に問題があります。

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 から削除すると、すべての子も削除する必要がありますが、削除されないことです。この目的のためにトリガーを作成しましたが、機能しません。

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サーバーは、ユーザーを削除してから、外部キーでリレーションを削除してから、トリガーを配置する必要があることを気にしていないようです...

何か案は?

4

1 に答える 1

0

そのトリガーは、次のようにoncms_usersではなく、 table で作成してから oncms_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 リレーションの要素を削除するためのトリガーを作成する必要がなくなります。

このフィドルを見て、それが機能していることを確認してください。

この質問の回答を見て、これが機能しないために何が違うのかを確認することをお勧めします。

于 2013-09-30T22:32:22.237 に答える