从另一个表升级到一个Postgres表



我有两个结构相同的表。所有列都是整数,并且被命名为"列";A"B";以及";键";。

我可以用一些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";其中键已经存在于我插入的表中。相反,我得到了这个错误:

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

以下是我真正想做的:当键已经存在于我插入的表中时,我想更新某些列:

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:我尝试了不使用大写表名的方法。这些列现在被称为";a"b";以及";键";。数据保持不变——都是整数。

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语句有问题,可能不是查询的前半部分,但除此之外,我没有线索了。有人能帮忙吗?

您几乎有了它,但您不能引用表名,您可以引用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;

此外,为了避免将来出现错误,请确保在语句的插入和选择部分中明确指定列名。它们现在是一样的,但可能并不总是这样。

相关内容

最新更新