
关于PostgreSQL ON CONFLICT的介绍
PostgreSQL 的 ON CONFLACION 是用来在同一行中插入两次数据,而这些数据是由 PostgreSQL 的约束条件或列来识别的。如果我们想在同一时间向同一列插入数据两次,我们必须在PostgreSQL中使用插入语句来处理冲突。当我们在向Postgres表传递相同的数据之前没有重复任何输入时,就会发生这种情况。
语法
Insert into name_of_table (name_of_column1, name_of_column2, name_of_column3, …, name_of_columnN) values (values_of_column1, values_of_column2, values_of_column3, …, value_of_columnN) ON conflict target action;
下面是PostgreSQL中关于冲突的参数描述语法。
- 插入 - 这被定义为通过使用PostgreSQL中的on conflict语句向表中插入行。
- 表的名称 -这被定义为插入时我们使用冲突语句的表的名称。
- 列名1到列名N - 这被定义为在使用冲突语句插入表时的定义列。因此,我们可以同时选择多个列来向表中插入数值。
- 第1列的值到第N列的值-这被定义为在使用冲突插入到表中时的定义列值。因此,我们可以根据我们在插入时定义的列数来定义值。
- 冲突时 - 这被定义为在PostgreSQL中使用的语句,用于将数据插入同一行两次。
- 目标 - 我们可以用冲突时语句定义目标值。目标值可以是一个约束名称,我们已经在冲突时语句中使用。
- 行动 - 这被定义为我们在PostgreSQL中使用on conflict语句所采取的行动。
ON CONFLICT 语句在PostgreSQL中是如何工作的?
- 下面是PostgreSQL中冲突语句的工作原理。
- 基本上,我们在PostgreSQL中的插入和更新语句中使用了on conflict语句。
- 如果我们想在同一时间用其他名字改变任何列名的数据,我们在插入语句中使用冲突语句。
- 如果我们恢复了公司的信息,我们必须改变邮件,那么我们就使用了冲突语句。
- 在PostgreSQL中,我们可以使用一个约束名称和on conflict语句;同样,我们也可以使用一个列名和on conflict语句。
- 如果我们将旧的列数据和新的列数据同时串联到表中,我们就使用了一个更新子句和插入和冲突语句。
- 当使用on conflict与do-nothing时,它将避免从其替代动作中插入行。
- 当使用on conflict做更新时,它将更新表中现有的行,这与表中的插入有冲突。
- 在PostgreSQL中使用on conflict语句时,冲突动作和冲突目标是非常有用和重要的参数。
- 在冲突中更新将保证自动更新和插入,并且它将提供独立的错误。
- 在PostgreSQL中,数据库合并被称为 upsert。这是因为当我们在表中插入了一条新的记录,PostgreSQL会更新表中已经存在的记录。
- 如果该行已经存在于表中,那么使用upsert,PostgreSQL将更新该行;否则,它将向表中插入一条新行。
- 在使用upsert的功能时,我们同时使用了冲突和插入语句。
- 为了支持 upsert 的功能,我们可以在 PostgreSQL 中使用冲突时插入语句。
例子
下面是一个关于冲突语句的例子。我们使用conflict_test表来描述PostgreSQL中关于冲突的一个例子。
下面是conflict_test表的表格和数据描述。
select * from conflict_test;
\d+ conflict_test;

例子#1 - 以约束条件名称为目标的冲突语句。
下面的例子显示了以约束条件名称为目标的冲突语句。
我们使用 "conflict_test_stud_name_key "作为冲突语句的约束条件。
INSERT INTO conflict_test (stud_name, stud_email) VALUES ('ABC', 'abc@hotmail.com') ON CONFLICT ON CONSTRAINT conflict_test_stud_name_key DO NOTHING;
select * from conflict_test;

示例#2 - 以列名为目标的冲突语句。
下面的例子显示了以列名为目标的on conflict语句。
我们使用stud_name作为冲突语句的列名。
INSERT INTO conflict_test (stud_name, stud_email) VALUES ('ABC', 'abc@hotmail.com') ON CONFLICT (stud_name) DO NOTHING;
select * from conflict_test;

示例#3 - 以更新语句为动作的冲突语句。
下面的例子显示了在PostgreSQL中以更新语句作为动作的冲突语句。
我们使用stud_name作为冲突语句的列名。此外,我们还使用stud_email作为更新语句。
在下面的例子中,我们看到abc@hotmail.com 邮件ID被添加到stud_name中的ABC。
INSERT INTO conflict_test (stud_name, stud_email) VALUES ('ABC', 'abc@hotmail.com') ON CONFLICT (stud_name) DO UPDATE SET stud_email = EXCLUDED.stud_email || ';' || conflict_test.stud_email;
select * from conflict_test;
