在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)。

以上

bannerAds