我认为自己对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 )
有没有更简单的方法来做到这一点?
答案 0 :(得分:0)
您可以将DELETE
与JOIN
一起使用,并一次删除两个表中的行。假设我理解了这些表之间的关系,你可以这样做:
$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个表中删除行。