在sqlite中更新(覆盖)整个记录(所有列)

时间:2019-01-10 10:53:58

标签: sqlite

将行从一个表复制到另一个表时,有一种方便的语法:

INSERT INTO table1 SELECT * FROM table2 WHERE <table 2 rows have some property>

但是,如果我想用table2中的全部行覆盖table1中的全部现有行,该怎么办?所以我想要类似的东西:

UPDATE table1 SET * FROM table2 WHERE <table 1 and 2 rows match on some key field>

但是据我所知,执行此操作的唯一方法是枚举逐一设置的列(set table1.columnA = table2.columnA, table1.columnB = table2.columnB,依此类推)。像使用INSERT一样,在使用UPDATE时是否有某种方式说“对所有列都执行”?如果没有,为什么不呢?

(我想我可以使用给定的属性删除table1中的所有行,然后使用INSERT INTO table1 SELECT *语法从table2中引入替换行。但这似乎在其中留下了一堆不需要的删除行相对于没有删除记录的干净UPDATE而言,数据库需要在某个时候清理一下?或者也许我不了解一堆删除再一堆插入的效率?)

1 个答案:

答案 0 :(得分:0)

针对您的实际想法,尚无此类语法,我认为您需要分别SET每列。另外,SQLite不支持直接更新联接语法,但是我们可以使用相关的子查询:

UPDATE table1
SET table1.columnA = (SELECT columnA FROM table2 WHERE table1.col = table2.col),
SET table1.columnB = (SELECT columnB FROM table2 WHERE table1.col = table2.col),
SET table1.columnC = (SELECT columnC FROM table2 WHERE table1.col = table2.col);