PostgreSQL INSERT INTO 语句详解
在 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;
这将在插入后返回 id、name 和 department。
5. 插入带 DEFAULT 值的列
如果某些列在表中有默认值,可以使用 DEFAULT 关键字:
INSERT INTO employees (name, age, department, salary)
VALUES ('Grace', 29, DEFAULT, 6000.00);
如果 department 有默认值(例如 'General'),则此语句会使用默认值。
6. 插入 JSON 数据
如果表包含 JSON 或 JSONB 类型字段:
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 需求或遇到问题,欢迎继续交流!🚀