SQL交叉删除行

时间:2015-01-16 22:20:17

标签: mysql sql

我认为自己对MySQL非常称职,但无法为这个找到一个好的解决方案。 简化,两个表,一个形容词有四种不同的变量:

--adjectives--
word_id INT
decl_m_id INT
decl_f_id INT
decl_n_id INT
decl_pl_id INT

--declensions--
id INT
nominative VARCHAR(100)
genitive VARCHAR(100)
dative VARCHAR(100)
...

现在我想删除一些名词并且必须编码

wordIds = ...
declsM  = sql( "SELECT decl_m_id FROM adjectives WHERE word_id IN ?", wordIds )
declsF  = sql( "SELECT decl_f_id FROM adjectives WHERE word_id IN ?", wordIds )
declsN  = sql( "SELECT decl_n_id FROM adjectives WHERE word_id IN ?", wordIds )
declsPl = sql( "SELECT decl_pl_id FROM adjectives WHERE word_id IN ?", wordIds )
sql( "DELETE FROM adjectives WHERE word_id IN ?", wordIds )
sql( "DELETE FROM declensions WHERE id IN ?", declsM+declsF+declsN+declsPl )

有没有更简单的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以将DELETEJOIN一起使用,并一次删除两个表中的行。假设我理解了这些表之间的关系,你可以这样做:

$sql = "DELETE adjectives.*, declensions.* 
FROM adjectives adj
JOIN declensions decl ON 
   (adj.decl_m_id = decl.id OR
   adj.decl_f_id = decl.id OR
   adj.decl_n_id = decl.id OR
   adj.decl_pl_id = decl.id)
WHERE adj.word_id IN ?";

这样您就可以删除adjectives中所有在给定集中都有word_id的行,还会删除与该word_id相关的所有变量。

我自己没有测试过,但我自己也使用了类似的查询(如果cascading delete并不总是需要的话)。

This answer提供了一个明确的示例,说明如何一次从2个表中删除行。