【问题标题】:How do I make an UPDATE while joining tables on SQLite?在 SQLite 上连接表时如何进行更新?
【发布时间】:2010-10-20 21:09:17
【问题描述】:

我试过了:

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 一起工作?

【问题讨论】:

标签: sqlite join sql-update


【解决方案1】:

你不能。 SQLitedoesn't support JOINs in UPDATE statements.

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

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

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

【讨论】:

  • 当你需要做的是将一列从一个表复制到另一个表以反转关联的方向时,这会变得很棘手。在 MySQL 中,您可能会执行类似的操作,创建 foos.bar_id 列,然后创建 update foos join bars on bars.foo_id = foos.id set foos.bar_id = bars.id,然后删除 bar.foo_id 列......这如何在 SQLite 中完成?如果有人知道,我肯定会使用它。
  • @hoff2 实际上,这可能是最简单的方法。就我而言,我什至不需要 WHERE EXISTS 部分:stackoverflow.com/a/3845931/847201
【解决方案2】:

您也可以使用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

【讨论】:

    猜你喜欢
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    相关资源
    最近更新 更多