我有两个结构相同的表。所有列都是整数,并且被命名为"列";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;
此外,为了避免将来出现错误,请确保在语句的插入和选择部分中明确指定列名。它们现在是一样的,但可能并不总是这样。