删除两个表中的行时的效率

时间:2011-07-21 08:58:29

标签: mysql sql

我有table1(id_table1)和table2(id_table2,id_table1)。我想删除table2中的记录(在给定条件下),但是也删除table1中与table2没有更多关系的项。在SQL中最有效的方法是什么?我正在使用mySql。

提前致谢!

3 个答案:

答案 0 :(得分:7)

如果使用InnoDB,请使用ON DELETE CASCADE添加外键约束。如果关系不再正确,这将自动删除行。这样,在删除table2中的行之后,您不必查询数据库以检查关系是否仍然完整。

Foreign key constraints

答案 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的效率会更高一些。