2015-08-15 68 views
0

我有一個用戶表的ID列的一個條目自動刪除有當它的鍵被刪除mysql的

與id列和user_ID的山坳是指ID在用戶表中的個人資料表

我想在刪除用戶時自動刪除配置文件。

這是可能的在MySQL?

+3

可能重複[MySQL的外鍵約束,級聯刪除](http://stackoverflow.com/questions/2914936/mysql-foreign-key-constraints-cascade-delete) – jpw

+0

確實可以使用外鍵。有關更多信息,請參閱http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html(或查看重複問題)。 – jpw

回答

2

假設有1到N的關係在父母子女實體之間,所以當你刪除父則相關的兒童將被刪除,只要你想。爲此,您使用ON DELETE CASCADE,如下所示。

您需要注意的是,根據您的設計,如果CHILD實體與一個或多個實體關聯,那麼您可能會導致意外問題,如中斷關係,刪除關聯表中的記錄等。另請閱讀上面鏈接中的存儲引擎也不能使用MuISAM

PARENT

CREATE TABLE `parent` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(45) COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

CHILD

CREATE TABLE `child` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `name` varchar(45) COLLATE utf8_unicode_ci NOT NULL, 
    `parent_id` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id_UNIQUE` (`id`), 
    KEY `FK_1_idx` (`parent_id`), 
    CONSTRAINT `FK_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

填充父

mysql> INSERT INTO parent (name) VALUES ('parent_1'), ('parent_2'); 
Query OK, 2 rows affected (0.00 sec) 
Records: 2 Duplicates: 0 Warnings: 0 

mysql> SELECT * FROM parent; 
+----+----------+ 
| id | name  | 
+----+----------+ 
| 1 | parent_1 | 
| 2 | parent_2 | 
+----+----------+ 
2 rows in set (0.00 sec) 

填充兒童

mysql> INSERT INTO child (name, parent_id) VALUES ('child_1', 1), ('child_2', 1), ('child_3', 2); 
Query OK, 3 rows affected (0.00 sec) 
Records: 3 Duplicates: 0 Warnings: 0 
mysql> SELECT * FROM child; 
+----+---------+-----------+ 
| id | name | parent_id | 
+----+---------+-----------+ 
| 1 | child_1 |   1 | 
| 2 | child_2 |   1 | 
| 3 | child_3 |   2 | 
+----+---------+-----------+ 
3 rows in set (0.00 sec) 

刪除的

mysql> DELETE FROM parent WHERE name = 'parent_1'; 
Query OK, 1 row affected (0.00 sec) 

mysql> SELECT * FROM child; 
+----+---------+-----------+ 
| id | name | parent_id | 
+----+---------+-----------+ 
| 3 | child_3 |   2 | 
+----+---------+-----------+ 
1 row in set (0.00 sec) 
2

您可以在表定義中執行此ON DELETE CASCADE命令。

參見:MySQL foreign key constraints, cascade delete

或者你可以使用觸發器做同樣的:

CREATE 
TRIGGER `delete_from_profile` 
AFTER DELETE ON `user` 
FOR EACH ROW 
BEGIN  
    DELETE 
    FROM profile 
    WHERE user_id = old.id; 
END