根据引用它们的行的值删除行

时间:2013-09-23 15:22:50

标签: mysql

我想按照以下方式做点什么:

delete c.* from Club c
where c.id in(select club_id from ClubAttrValues where value='E5');

但是当我尝试这个时,我得到了错误

Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`foroige`.`clubattrvalues`, CONSTRAINT `FKAE90CBE9EE3B7895` FOREIGN KEY (`club_id`) REFERENCES `Club` (`id`))

有没有办法删除与Club中每个俱乐部有关的所有内容,ClubAttrValues中的值为'E5'。 ClubAttrValues中有多个行具有相同的club_id,理想情况下会删除所有行,而Club中的club_id引用ID。

我已尝试在MySQL工作台中设置ON DELETE CASCADE,但即便如此也没有区别。

俱乐部表格如下:

+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| created   | datetime     | YES  |     | NULL    |                |
| deleted   | tinyint(1)   | NO   |     | NULL    |                |
| modified  | datetime     | YES  |     | NULL    |                |
| address1  | varchar(255) | NO   |     | NULL    |                |
| address2  | varchar(255) | YES  |     | NULL    |                |
| country   | varchar(255) | YES  |     | NULL    |                |
| county    | varchar(255) | NO   |     | NULL    |                |
| email     | varchar(255) | YES  |     | NULL    |                |
| fax       | varchar(255) | YES  |     | NULL    |                |
| mobile    | varchar(255) | YES  |     | NULL    |                |
| name      | varchar(255) | NO   |     | NULL    |                |
| postcode  | varchar(255) | YES  |     | NULL    |                |
| telephone | varchar(255) | YES  |     | NULL    |                |
| town      | varchar(255) | YES  |     | NULL    |                |
| type      | varchar(255) | NO   |     | NULL    |                |
| parent_id | bigint(20)   | YES  | MUL | NULL    |                |
| lft       | bigint(20)   | NO   |     | NULL    |                |
| rgt       | bigint(20)   | NO   |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+

和我的ClubAttrValues表:

+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| name    | varchar(255) | NO   |     | NULL    |                |
| value   | text         | YES  |     | NULL    |                |
| club_id | bigint(20)   | YES  | MUL | NULL    |                |
+---------+--------------+------+-----+---------+----------------+

2 个答案:

答案 0 :(得分:2)

在删除之前尝试:

SET FOREIGN_KEY_CHECKS=0

完成后将其设置为1。

答案 1 :(得分:0)

当您为外键列设置on delete cascade然后

时,它会起作用
delete c
from Club c
inner join ClubAttrValues a on a.club_id = c.id
where a.value = 'E5'

See this SQLFiddle demo