PostgreSQL INSERT INTO 语句详解
                           
天天向上
发布: 2025-03-11 23:27:15

原创
70 人浏览过

在 PostgreSQL 中,INSERT INTO 语句用于向表中插入数据。它支持多种插入方式,包括单行插入、多行插入、从查询结果插入数据,以及带 RETURNING 关键字获取插入数据的信息。


1. INSERT INTO 语法

1.1 基本语法

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
  • table_name:要插入数据的表名。
  • column1, column2, column3, ...:指定要插入数据的列(可选)。
  • VALUES (value1, value2, value3, ...):提供插入的数据值。

2. 插入数据示例

2.1 插入单行数据

假设有一个 employees 表:

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    age INT,
    department VARCHAR(50),
    salary DECIMAL(10,2)
);

插入一条数据:

INSERT INTO employees (name, age, department, salary)
VALUES ('Alice', 30, 'HR', 5000.00);

2.2 插入多行数据

INSERT INTO employees (name, age, department, salary)
VALUES 
    ('Bob', 25, 'IT', 6000.00),
    ('Charlie', 35, 'Finance', 7000.00),
    ('Diana', 40, 'Marketing', 8000.00);

2.3 省略列名插入

如果要插入所有列,并且按列的顺序提供所有值,则可以省略列名:

INSERT INTO employees
VALUES (DEFAULT, 'Eve', 28, 'Sales', 5500.00);

注意:

  • DEFAULT 关键字用于自动填充 SERIAL 类型的 id

3. 从查询结果插入数据

可以使用 INSERT INTO ... SELECT 从另一个表插入数据:

INSERT INTO employees (name, age, department, salary)
SELECT name, age, department, salary FROM old_employees;

这样会把 old_employees 表的所有记录插入 employees


4. 使用 RETURNING 关键字

PostgreSQL 允许在 INSERT 语句后使用 RETURNING,返回插入的数据:

INSERT INTO employees (name, age, department, salary)
VALUES ('Frank', 32, 'IT', 6500.00)
RETURNING id, name, department;

这将在插入后返回 idnamedepartment


5. 插入带 DEFAULT 值的列

如果某些列在表中有默认值,可以使用 DEFAULT 关键字:

INSERT INTO employees (name, age, department, salary)
VALUES ('Grace', 29, DEFAULT, 6000.00);

如果 department 有默认值(例如 'General'),则此语句会使用默认值。


6. 插入 JSON 数据

如果表包含 JSONJSONB 类型字段:

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    details JSONB
);

插入 JSON 数据:

INSERT INTO products (name, details)
VALUES ('Laptop', '{"brand": "Dell", "processor": "i7", "RAM": "16GB"}');

7. 处理冲突 (ON CONFLICT DO NOTHING / ON CONFLICT DO UPDATE)

PostgreSQL 支持 ON CONFLICT 处理插入冲突:

INSERT INTO employees (id, name, age, department, salary)
VALUES (1, 'Henry', 31, 'Finance', 7500.00)
ON CONFLICT (id) DO NOTHING;

如果 id 1 已存在,则不会执行插入。

或者,在冲突时更新数据:

INSERT INTO employees (id, name, age, department, salary)
VALUES (1, 'Henry', 32, 'Finance', 7700.00)
ON CONFLICT (id) DO UPDATE SET age = EXCLUDED.age, salary = EXCLUDED.salary;

其中:

  • EXCLUDED.age 表示新插入的数据 age
  • 仅当 id 冲突时才会执行 UPDATE

8. 事务控制 (BEGIN, COMMIT, ROLLBACK)

PostgreSQL 允许在事务中插入数据:

BEGIN;

INSERT INTO employees (name, age, department, salary)
VALUES ('Ivy', 26, 'Support', 5000.00);

-- 如果出错,可以回滚
ROLLBACK;
-- 如果没问题,提交事务
COMMIT;
  • ROLLBACK 撤销插入操作。
  • COMMIT 确认插入操作。

9. 插入 COPY 命令(大批量数据)

如果要插入大量数据,COPY 语句比 INSERT 更高效:

COPY employees(name, age, department, salary)
FROM '/path/to/data.csv' DELIMITER ',' CSV HEADER;

这比 INSERT 快得多,适用于批量导入。


10. 总结

插入方式SQL 语法
单行插入INSERT INTO table (col1, col2) VALUES (val1, val2);
多行插入INSERT INTO table (col1, col2) VALUES (val1, val2), (val3, val4);
省略列名插入INSERT INTO table VALUES (val1, val2, val3);
从查询结果插入INSERT INTO table SELECT col1, col2 FROM other_table;
返回插入数据INSERT INTO table VALUES (...) RETURNING col1, col2;
插入 JSON 数据INSERT INTO table (json_col) VALUES ('{"key": "value"}');
冲突处理(忽略冲突)INSERT INTO table VALUES (...) ON CONFLICT (col) DO NOTHING;
冲突处理(更新数据)INSERT INTO table VALUES (...) ON CONFLICT (col) DO UPDATE SET col = value;
事务控制BEGIN; INSERT ...; COMMIT;
批量导入COPY table FROM 'file.csv' DELIMITER ',' CSV HEADER;

11. 结论

  • INSERT INTO 是 PostgreSQL 用于插入数据的主要方法,支持单行、多行和从查询结果插入。
  • 通过 RETURNING 关键字可以获取插入的数据。
  • ON CONFLICT 处理插入冲突,适用于主键或唯一索引约束。
  • 在大数据插入场景下,COPY 命令比 INSERT 更高效。

如果你有具体的 INSERT INTO 需求或遇到问题,欢迎继续交流!🚀

发表回复 0

Your email address will not be published. Required fields are marked *