从另一个 table 更新到一个 Postgres table?

Upserting into one Postgres table from another table?

我有两个具有相同结构的table。所有列都是整数,并命名为“A”、“B”和“key”。

我可以像这样从一个 table 插入另一个 SQL:

INSERT INTO test_table_kewmfsznj
    SELECT * FROM tmp_test_table_kewmfsznj_cnxtbkbq ta

但这不起作用:

INSERT INTO test_table_kewmfsznj
    SELECT * FROM tmp_test_table_kewmfsznj_cnxtbkbq ta
ON CONFLICT ("key") 
    DO NOTHING

我的期望是此代码会跳过“ta”中的任何行,其中密钥已存在于我要插入的 table 中。相反,我收到此错误:

ERROR: missing FROM-clause entry for table "ta"
  Position: 152

这是我真正想做的:当我要插入的 table 中已经存在密钥时,我想更新某些列:

INSERT INTO test_table_kewmfsznj
    SELECT * FROM tmp_test_table_kewmfsznj_cnxtbkbq ta
ON CONFLICT ("key") 
    DO UPDATE SET "A" = ta."A", "B" = ta."B"

不幸的是,这给了我(几乎)同样的错误:

ERROR: missing FROM-clause entry for table "ta"
  Position: 134

有人可以解释一下我做错了什么吗?

EDIT0:我试过不使用大写 table 名称。这些列现在称为“a”、“b”和“key”。数据保持不变——都是整数。

INSERT INTO test_table_mrcvnaoia
    SELECT * from tmp_test_table_mrcvnaoia_uuxkaidv ta
ON CONFLICT (key)
    DO UPDATE SET a = ta.a, b = ta.b

...现在我收到此错误:

SQL Error [42P01]: ERROR: missing FROM-clause entry for table "ta"
  Position: 129

对我来说,这表明我的 ON CONFLICT 语句有问题,而且可能不是查询的前半部分,但除此之外我没有任何线索。有人可以帮忙吗?

您几乎拥有它,但您无法引用 table 名称,您引用了 EXCLUDED:

INSERT INTO test_table_mrcvnaoia
    SELECT * from tmp_test_table_mrcvnaoia_uuxkaidv
ON CONFLICT (key)
    DO UPDATE SET a = EXCLUDED.a, b = EXCLUDED.b;

此外,为避免将来出错,请确保在语句的插入和 select 部分明确指定列名。它们目前是相同的,但情况可能并非总是如此。