如何从MySQL中的两个不同的表中删除重复的字段

时间:2013-02-28 11:20:26

标签: mysql sql delete-row

想象一下,你有两张桌子。

表栏:

+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| name  | varchar(255) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+

表foo:

+------------------+--------------+------+-----+---------+-------+
| Field            | Type         | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+-------+
| name_alternative | varchar(255) | YES  |     | NULL    |       |
+------------------+--------------+------+-----+---------+-------+

并且您希望从表bar中移除与name

中的字段name_alternative具有相同foo值的行

我可以使用以下查询:

DELETE FROM foo WHERE name IN (SELECT name_alternative FROM bar);

但这需要很长时间才能在两个表中执行大量记录。

所以我想知道这个查询是否有更好的替代方案。

3 个答案:

答案 0 :(得分:1)

这是另一种可行的方法,我认为它会更有效:

DELETE FROM bar
    USING foo, bar
    WHERE name_alternative = name

这是working SQLFiddle example

See the documentation for delete

答案 1 :(得分:1)

除了@ dan1 {4}之外,我的猜测是需要很长时间,因为bar(name)上没有索引。

您不需要覆盖整个255个字符的索引,具体取决于您的字符串,即如果许多行中的第一个字符不同,则在几个字符上创建索引

CREATE INDEX indexname ON bar(name(8))

8是您可能想要优化的建议值。该索引将帮助mysql找到与 foo.namealternative 匹配的每个 bar

答案 2 :(得分:0)

delete from bar
using (
    select foo.name_alternative
    from 
        bar
        inner join
        foo on bar.name = foo.name_alternative
) s
where bar.name = s.name_alternative