我在mySQL中有3个表,我正在处理以下删除词:
DELETE c, b, e
FROM category c, block b, element e
WHERE
c.category_id = 1 AND
c.category_template_id = 1 AND
b.block_category_id = c.category_id AND
e.element_category_id = c.category_id
此删除词的工作原理,将删除具有ID = 1的表类别的数据行,以及表块中和表元素中的相应数据行。
但是,在表格块和/或表元素中没有相应的数据,删除词没有完全删除任何内容(即使有一个数据行,ID = 1 in gen in Caltory)。<<<<<<<<<<<<<<<<<<<<
如何更改陈述以解决此问题?我现在搜索了MySQL-Docs,Google和Stackoverflow近14小时。请帮助我。
感谢您的回答!
在您的查询中使用mysql JOIN
,如下所示,
DELETE c, b, e
FROM category c
LEFT JOIN block b ON c.category_id = b.block_category_id LEFT JOIN element e ON e.element_category_id = c.category_id
WHERE c.category_id = 1 AND c.category_template_id = 1;
可能会帮助您
使用以下内容更改block
和element
的表定义:
ALTER TABLE block
ADD CONSTRAINT fk_block_category
FOREIGN KEY (block_category_id)
REFERENCES category (category_id)
ON DELETE CASCADE
ALTER TABLE element
ADD CONSTRAINT fk_element_category
FOREIGN KEY (element_category_id)
REFERENCES category (category_id)
ON DELETE CASCADE
现在进行以下删除时:
DELETE
FROM category
WHERE
category_id = 1 AND
category_template_id = 1;
除了删除匹配的category
记录外,其他两个表中指的是指category
中已删除的记录的所有记录也将被删除。
请注意,可能有一种方法可以补救您当前的删除加入查询。如果您使用的是Myisam,这将是您唯一的选择。但是,由于您正在使用InnoDB,因此ON DELETE CASCADE
可能是前往此处的更理智的方法。