在SQLite上联接表时如何进行UPDATE?


92

我试过了 :

UPDATE closure JOIN item ON ( item_id = id ) 
SET checked = 0 
WHERE ancestor_id = 1

和:

UPDATE closure, item 
SET checked = 0 
WHERE ancestor_id = 1 AND item_id = id

两者都适用于MySQL,但是它们在SQLite中给了我语法错误。

如何使此UPDATE / JOIN与SQLite 3.5.9版一起使用?


Answers:


128

你不能 SQLite 不支持UPDATE语句中的JOIN

但是,您可能可以使用子查询来代替:

UPDATE closure SET checked = 0 
WHERE item_id IN (SELECT id FROM item WHERE ancestor_id = 1);

或类似的东西; 目前尚不清楚您的架构是什么。


20
当您需要做的是将一列从一个表复制到另一个表以反转关联的方向时,这变得很麻烦。在MySQL中,您可能会执行以下操作:创建foos.bar_id列,然后创建update foos join bars on bars.foo_id = foos.id set foos.bar_id = bars.id,然后删除bars.foo_id列...在SQLite中如何做到这一点?如果有人知道,我肯定可以使用。
hoff2 2011年

@ hoff2实际上,这可能是最简单的方法。就我而言,我什至不需要在哪里存在:stackoverflow.com/a/3845931/847201
ACK_stoverflow '16

6

您也可以使用REPLACE,然后可以将选择与联接一起使用。像这样:

REPLACE INTO clusure 
 SELECT sel.col1,sel.col2,....,sel.checked --checked should correspond to column that you want to change
FROM (
 SELECT *,0 as checked FROM closure LEFT JOIN item ON (item_id = id) 
 WHERE ancestor_id = 1) sel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.