我有table1(id_table1)和table2(id_table2,id_table1)。我想删除table2中的记录(在给定条件下),但是也删除table1中与table2没有更多关系的项。在SQL中最有效的方法是什么?我正在使用mySql。
提前致谢!
答案 0 :(得分:7)
如果使用InnoDB,请使用ON DELETE CASCADE
添加外键约束。如果关系不再正确,这将自动删除行。这样,在删除table2中的行之后,您不必查询数据库以检查关系是否仍然完整。
答案 1 :(得分:0)
除了cularis的回答效率较低的选项,如果您使用MyISAM,则没有外键约束。
创建一个触发器:
DELIMITER $$
CREATE TRIGGER ad_table1_each AFTER DELETE ON table2 FOR EACH ROW
BEGIN
DELETE FROM table1 WHERE table1.table2_id = OLD.id;
END $$
DELIMITER ;
http://dev.mysql.com/doc/refman/5.5/en/triggers.html
http://dev.mysql.com/doc/refman/5.5/en/create-trigger.html
答案 2 :(得分:0)
假设您没有设置任何级联删除,并且因为您询问了如何在sql中执行此操作,我可以看到两个选项:
1)从table2删除where(condition)
delete from table1 where id not in (select distinct id_table1 from table2)
2)从table1中删除id in(从table2中选择不同的id_table1 where(condition))
delete from table2 where id_table2 not in (select id from table1)
假设table2的大小比table1大得多,并且条件会大大缩短大小 方法1扫描完整的table2一次,删除许多记录,然后扫描一次 方法2扫描完整的table2两次
这让我觉得如果表的大小非常大,方法1的效率会更高一些。