pgsql merge into
时间: 2025-06-09 14:17:28 浏览: 10
在 PostgreSQL 中,虽然标准 SQL 提供了 `MERGE INTO` 语句用于实现“合并”操作(即插入或更新),但 PostgreSQL 并未直接支持 `MERGE INTO` 语法。不过,可以通过 `INSERT ... ON CONFLICT` 语句来实现类似的功能。
以下是使用 `INSERT ... ON CONFLICT` 实现 `MERGE INTO` 的示例。
---
### 示例代码
假设我们有一个名为 `employees` 的表,包含以下字段:
- `id`:主键,唯一标识员工。
- `name`:员工姓名。
- `salary`:员工薪资。
#### 表结构
```sql
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
salary DECIMAL(10, 2) NOT NULL
);
```
#### 插入或更新数据
```sql
-- 如果记录不存在,则插入;如果存在,则更新
INSERT INTO employees (id, name, salary)
VALUES (1, 'Alice', 5000.00)
ON CONFLICT (id) DO UPDATE
SET
name = EXCLUDED.name,
salary = EXCLUDED.salary;
```
---
### 代码解释
1. **`INSERT INTO employees`**:
- 插入一条新记录到 `employees` 表中。
- 指定要插入的字段和值。
2. **`ON CONFLICT (id)`**:
- 指定冲突的条件为 `id` 字段。
- 如果 `id` 已经存在于表中,则触发冲突处理逻辑。
3. **`DO UPDATE SET`**:
- 更新现有记录的字段值。
- 使用 `EXCLUDED` 关键字引用尝试插入的值。
4. **`EXCLUDED`**:
- `EXCLUDED` 是一个特殊的表,表示尝试插入但因冲突而未成功插入的值。
- 在此示例中,`EXCLUDED.name` 和 `EXCLUDED.salary` 分别表示尝试插入的 `name` 和 `salary` 值。
---
### 测试用例
#### 初始状态
```sql
SELECT * FROM employees;
-- 输出为空,因为表是空的
```
#### 第一次执行(插入)
```sql
INSERT INTO employees (id, name, salary)
VALUES (1, 'Alice', 5000.00)
ON CONFLICT (id) DO UPDATE
SET
name = EXCLUDED.name,
salary = EXCLUDED.salary;
-- 查询结果
SELECT * FROM employees;
-- 输出:
-- id | name | salary
-- ---+-------+--------
-- 1 | Alice | 5000.00
```
#### 第二次执行(更新)
```sql
INSERT INTO employees (id, name, salary)
VALUES (1, 'Alice Updated', 6000.00)
ON CONFLICT (id) DO UPDATE
SET
name = EXCLUDED.name,
salary = EXCLUDED.salary;
-- 查询结果
SELECT * FROM employees;
-- 输出:
-- id | name | salary
-- ---+---------------+--------
-- 1 | Alice Updated | 6000.00
```
---
###
阅读全文
相关推荐





