2015-08-15 62 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