postgresql SQL插入新行,但保留冲突键中旧值

ruyhziif  于 2022-11-29  发布在  PostgreSQL
关注(0)|答案(2)|浏览(104)

假设我有两个表:
TB1:

id name date
1 John 01/01/2012
1 John 01/02/2012
2 James 02/02/2020

TB2:

id name date
1 John 01/01/2013
1 John 01/01/2012

tb1tb2的唯一性来自于(id, name,date)列的组合。因此,我希望只插入tb2中对tb1来说是新的值。在这种情况下,只插入(1,John,01/01/2013),因为另一行已经存在于tb1中。
我的尝试是:

INSERT INTO tb1 (date) SELECT * FROM tb2 ON CONFLICT (id,name,date) DO NOTHING;
xe55xuns

xe55xuns1#

您没有告诉我们您遇到的错误是什么。但仅从语法检查来看,它将导致以下错误:
错误:INSERT的表达式多于目标列
因为您指定了一个目标列,但SELECT语句提供了三个列。
假设您在这三个数据行上指定了唯一的条件约束或主索引键,则在INSERT陈述式中加入其他数据行应该可以运作:

INSERT INTO tb1 (id,name,date) 
SELECT id,name,date 
FROM tb2 ON CONFLICT (id,name,date) DO NOTHING;
xzabzqsa

xzabzqsa2#

SQL语言是一种非过程语言,只是一种查询语言......您必须对查询执行此操作,例如:

INSERT INTO tb1 (id,name,date) 
SELECT * 
FROM   tb2 
WHERE  NOT EXISTS(SELECT * 
                  FROM   tb1 INNER JOIN tb2 
                         ON ROW (tb1.id, tb1.name, tb1.date) = 
                            ROW (tb2.id, tb2.name, tb2.date));

相关问题