没有主键如何从表中删除记录

5
我需要从数据库表中删除一些特定记录,但是该表本身没有主键。因此,条件取决于其他表。那么正确的方法是什么?
  delete from table_1 
    where exists 
         (select distinct tb.* 
          from table_1 tb, table_2 tb_2, table_3 tb_3
          where tb1.col = tb2.col
          and tb3.col = tb2.col
          and tb3.col_2= 10)

这样做是正确的吗?假设table_1有4列,前两列应该是要删除的标准。

1
这是正确的方法。我建议先运行一个选择查询并验证返回的记录确实是您要删除的记录。 - Dan Bracuk
2
你需要关联子查询。如果按照现有写法,如果子查询返回单行结果,则会删除table_1中的所有行。 - Shannon Severance
1个回答

1
如果你的查询选择版本返回了你想要删除的结果,那就没问题了。不过有几个要点需要注意:
使用 ANSI 兼容的显式连接语法,而不是逗号分隔的隐式语法(已经被淘汰了)。显式语法看起来更好,更容易阅读。
将你的 EXISTS 子查询与主表进行关联。你不需要使用 DISTINCT,它会返回匹配行数为 1 或 100 亿的情况。
SELECT *
FROM table_1 tb_1
WHERE EXISTS (SELECT *
              FROM table_2 tb_2
              JOIN table_3 tb_3 ON tb_2.col = tb_3.col
              WHERE tb_1.col = tb_2.col
              AND tb_3.col_2 = 10)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接