📜  PostgreSQL – 更新插入

📅  最后修改于: 2022-05-13 01:57:05.043000             🧑  作者: Mango

PostgreSQL – 更新插入

UPSERT 语句是一种 DBMS 功能,它允许 DML 语句的作者插入一行,或者如果该行已经存在,则改为更新该现有行。这就是为什么该操作被称为 UPSERT(简单地混合了更新和插入)。为了实现 UPSERT 的功能,PostgreSQL 使用 INSERT ON CONFLICT 语句。

句法:

INSERT INTO table_name(column_list)  
VALUES(value_list)
ON CONFLICT target action;

如果我们分析上面的语法:

  • 目标可以是:
  1. (column_name) – 任何列名。
  2. ON CONSTRAINT constraint_name – 约束名称可以是唯一约束的名称。
  3. WHERE 谓词– 带有布尔条件的 WHERE 子句。
  • 动作可以是:
  1. DO NOTHING – 如果该行已存在于表中,则什么也不做。
  2. DO UPDATE SET columnA = valueA, ...。 WHERE 条件——根据条件更新表中的某些字段。

首先,我们使用以下命令创建一个示例表来执行示例:

CREATE TABLE employees (
 employee_id serial PRIMARY KEY,
 full_name VARCHAR NOT NULL,
 manager_id INT
);

然后我们将数据插入到我们的员工表中,如下所示:

INSERT INTO employees (
 employee_id,
 full_name,
 manager_id
)
VALUES
 (1, 'M.S Dhoni', NULL),
 (2, 'Sachin Tendulkar', 1),
 (3, 'R. Sharma', 1),
 (4, 'S. Raina', 1),
 (5, 'B. Kumar', 1),
 (6, 'Y. Singh', 2),
 (7, 'Virender Sehwag ', 2),
 (8, 'Ajinkya Rahane', 2),
 (9, 'Shikhar Dhawan', 2),
 (10, 'Mohammed Shami', 3),
 (11, 'Shreyas Iyer', 3),
 (12, 'Mayank Agarwal', 3),
 (13, 'K. L. Rahul', 3),
 (14, 'Hardik Pandya', 4),
 (15, 'Dinesh Karthik', 4),
 (16, 'Jasprit Bumrah', 7),
 (17, 'Kuldeep Yadav', 7),
 (18, 'Yuzvendra Chahal', 8),
 (19, 'Rishabh Pant', 8),
 (20, 'Sanju Samson', 8);

表格是:

示例 1:

下面的查询用于将employee_id 6(如果存在这样的雇员)的名称从Y. Singh 更改为Yuvraj Singh,或者如果这样的雇员不存在则插入记录。

insert into employees(employee_id,full_name)
values(6,'Yuvraj Singh')
on conflict(employee_id)
do
update set full_name=EXCLUDED.full_name; 

要检查对表的更改,我们使用以下查询:

select * from employees;

输出:

在此示例中,我们尝试使用 UPDATE 子句作为 INSERT 语句的操作来更新 ID 为 6 的员工的姓名(如果员工存在)。

示例 2:

以下查询用于插入员工 ID 为 18 且名称为“W”的员工。 Sundar' 和经理 id '6'(如果不存在记录)但什么也不做,以防表中已经存在这样的记录。

insert into employees(employee_id,full_name,manager_id)
values(18,'W. Sundar',6)
on conflict (employee_id)
do nothing;

要检查对表的更改,我们使用以下查询:

select * from employees;

输出:

在此示例中,表中没有任何更改,因为员工 ID 为 18 的员工已经存在,并且操作是什么都不做。

示例 3:

下面的查询用于插入员工 ID 为 21 且名称为“W”的员工。 Sundar' 和经理 id '6'(如果不存在记录)但什么也不做,以防表中已经存在这样的记录。

insert into employees(employee_id,full_name,manager_id)
values(21,'W. Sundar',6)
on conflict (employee_id)
do nothing; 

要检查对表的更改,我们使用以下查询:

select * from employees;

输出:

在此示例中,将一条新记录插入到表中,因为表中不存在员工 ID 为 21 的现有员工。