【发布时间】:2014-09-05 09:47:27
【问题描述】:
我有两个结构相同的表(例如“foo”和“bar”)和一个主键(例如“a”):
CREATE TABLE foo(a INT PRIMARY KEY, b VARCHAR(10));
INSERT INTO foo(a, b) VALUES (1, 'foo'), (2, 'foo');
CREATE TABLE bar(a INT PRIMARY KEY, b VARCHAR(10));
INSERT INTO bar(a, b) VALUES (2, 'bar'), (3, 'bar');
现在我想用主键匹配的表'bar'中的行的值更新表'foo'的行,并且我想将表'bar'中的行插入表'如果主键在表 'foo' 中不存在,则 foo':
UPDATE foo SET b = bar.b FROM bar WHERE foo.a = bar.a;
INSERT INTO foo SELECT bar.* FROM bar LEFT JOIN foo USING (a) WHERE foo.a IS NULL;
这是我想要的,但我想知道是否有更有效的方法来做到这一点?
【问题讨论】:
-
也许使用 MERGE 语句?
-
PostgreSQL 似乎没有 MERGE 语句。
-
是的;我刚刚从documentation 中找到了。它明确列出了 PostgreSQL 9.3.5 不支持的 F312 MERGE 语句(以及 F313 和 F314,MERGE 的装饰)。在没有 MERGE 的情况下,我怀疑是否有比您已经在做的更好的方法来做这件事,被事务或保存点包围。
-
搜索“Postgresql upsert”
-
你是怎么遇到这种情况的?您可能想查看两个表不同步的原因/原因
标签: sql postgresql postgresql-9.3