一个无限分类的数据库,字段如下:
1、id
2、pid (父亲id)
3、name现在想:如果删除一个分类,想让它下面的所有子分类一起删除,于是想让pid参考自身的id以下是SQL语句:
ALTER TABLE `gaojiao_class`
ADD FOREIGN KEY (`pid`) REFERENCES `gaojiao_class` (`id`)
ON DELETE CASCADE;结果mysql报出以下错误:Cannot add or update a child row: a foreign key constraint fails请教:MYSQL不能这样做吗,有没有其他替代的做法,求各位大侠赐教
1、id
2、pid (父亲id)
3、name现在想:如果删除一个分类,想让它下面的所有子分类一起删除,于是想让pid参考自身的id以下是SQL语句:
ALTER TABLE `gaojiao_class`
ADD FOREIGN KEY (`pid`) REFERENCES `gaojiao_class` (`id`)
ON DELETE CASCADE;结果mysql报出以下错误:Cannot add or update a child row: a foreign key constraint fails请教:MYSQL不能这样做吗,有没有其他替代的做法,求各位大侠赐教
engine='innodb';
Query OK, 0 rows affected (0.16 sec)mysql> alter table gaojiao_class add FOREIGN KEY (`pid`) REFERENCES gaojiao_clas
s (`id`) ;
Query OK, 0 rows affected (0.13 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql>
delete from a where a.pid=100;
delete from a where a.id=100;
两条命令来处理就可以实现了。不过要注意放到一个事务里,保证数据的一致性。还可以用触发器来做,那就麻烦多了。
engine='innodb';
Query OK, 0 rows affected (0.01 sec)mysql> alter table gaojiao_class add FOREIGN KEY (`pid`) REFERENCES gaojiao_clas
s (`id`) ON DELETE CASCADE;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> insert into gaojiao_class values (1,null,'a01');
Query OK, 1 row affected (0.01 sec)mysql> insert into gaojiao_class values (2,4,'a01');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint f
ails (`csdn`.`gaojiao_class`, CONSTRAINT `gaojiao_class_ibfk_1` FOREIGN KEY (`pi
d`) REFERENCES `gaojiao_class` (`id`) ON DELETE CASCADE)
mysql> insert into gaojiao_class values (2,1,'a01');
Query OK, 1 row affected (0.01 sec)mysql> insert into gaojiao_class values (3,2,'a01');
Query OK, 1 row affected (0.01 sec)mysql> insert into gaojiao_class values (4,2,'a01');
Query OK, 1 row affected (0.01 sec)mysql> insert into gaojiao_class values (5,2,'a01');
Query OK, 1 row affected (0.00 sec)mysql> insert into gaojiao_class values (6,3,'a01');
Query OK, 1 row affected (0.02 sec)mysql> select * from gaojiao_class;
+----+------+------+
| id | pid | name |
+----+------+------+
| 1 | NULL | a01 |
| 2 | 1 | a01 |
| 3 | 2 | a01 |
| 4 | 2 | a01 |
| 5 | 2 | a01 |
| 6 | 3 | a01 |
+----+------+------+
6 rows in set (0.00 sec)mysql> show create table gaojiao_class;
+---------------+---------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
---------+
| Table | Create Table |
+---------------+---------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
---------+
| gaojiao_class | CREATE TABLE `gaojiao_class` (
`id` int(11) NOT NULL,
`pid` int(11) DEFAULT NULL,
`name` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `pid` (`pid`),
CONSTRAINT `gaojiao_class_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `gaojiao_clas
s` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------------+---------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
---------+
1 row in set (0.00 sec)mysql> delete from gaojiao_class where id=2;
Query OK, 1 row affected (0.02 sec)mysql> select * from gaojiao_class;
+----+------+------+
| id | pid | name |
+----+------+------+
| 1 | NULL | a01 |
+----+------+------+
1 row in set (0.00 sec)mysql>