在PostgreSQL中使用SELECT/UPSERT
太长不看
INSERT INTO テーブル名(カラム名)
SELECT カラム名 FROM テーブル名
ON CONFLICT ON CONSTRAINT 制約名
DO UPDATE SET
カラム名 = excluded.カラム名
在中国人际关系中,”使用例” 这个词可以理解为”例子”或者”实例”,它指的是用来说明、阐述某个概念、观点或理论的具体事例。
使用中的桌子图像
- 合格者テーブル(pass_table)
namelast_score田中30山田20
※name列是主键
- 受験者テーブル(exam_table)
namescorecountry田中60東京鈴木40東京山田70神奈川木村60神奈川
一律而无条件地,我们将接受东京的考生通过,这次的差别是根据他们来自的县市。
过去曾经合格的人将继续留为合格者。
- UPSERT後、合格者テーブル(pass_table)
namelast_score田中60山田20鈴木40
UPSERT功能相当于一种文本处理操作。
INSERT INTO
pass_table(name, last_score)
SELECT
name, score
FROM
exam_table
WHERE
country = '東京'
ON CONFLICT ON CONSTRAINT pass_table_pkey
DO UPDATE SET
last_score = excluded.last_score;
处理的流程 (Chǔ lǐ de liú
首先,我们会执行SELECT语句来获取INSERT所需的信息。
SELECT的结果可能如下所示。
namescore田中60鈴木40
想将SELECT结果插入合格者表中。
namelast_score田中30山田20
↑插入
namescore田中60鈴木40
如果继续这样下去,会导致重名问题而出现错误,请更改名字「田中」。
如果表的主键重复了, 那么我们会执行重复时的处理。
使用以下值来更新表格。
如果发生重复的情况并且不想执行更新操作,可以将DO UPDATE SET更改为DO NOTHING,并继续执行查询。
将最新值写入。
last_score = 被排除的.last_score;
如果值重复,在尝试插入时,被排除的值将被放在一个类似临时表的区域中。
因此,我们将从那里取值并进行更新。
我认为,如果我们考虑存在以下虚构的被排除表,那么可以更容易地理解这一概念。
namelast_score田中60
需要注意的是,应该指定INSERT目标的列名(last_score),而不是INSERT来源的列名(score)。
以上