PostgreSQL ON CONFLICT介绍及实例

807 阅读4分钟

PostgreSQL ON CONFLICT

关于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;

PostgreSQL ON CONFLICT output 1

例子#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;

PostgreSQL ON CONFLICT output 2

示例#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;

output 3

示例#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;

output 4