PostgreSQL插入数据的核心是使用INSERT语句,通过不同的语法格式可以满足多种写入场景的需求,适合不同复杂度的数据录入操作。

基础单条数据插入
最基础的插入方式是向表中所有列插入对应的值,语法格式为INSERT INTO 表名 VALUES (值1, 值2, ...),值的顺序需要和表定义的列顺序完全一致。
首先我们先创建一个测试表,用于后续的插入操作演示:
-- 创建用户测试表
CREATE TABLE user_info (
id INT PRIMARY KEY,
user_name VARCHAR(50),
age INT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
向该表插入单条完整数据的示例如下:
-- 插入单条完整数据 INSERT INTO user_info VALUES (1, '张三', 25, '2024-05-20 10:30:00');
指定列插入数据
如果不需要向所有列插入值,可以指定要插入的列名,未指定的列如果有默认值会使用默认值,没有默认值且不允许为NULL则会报错。语法格式为INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...)。
比如只插入id、user_name和age列,create_time使用默认值:
-- 指定列插入,create_time使用默认值 INSERT INTO user_info (id, user_name, age) VALUES (2, '李四', 28);
批量插入多条数据
如果需要一次性插入多条数据,不需要执行多次INSERT语句,可以在VALUES后跟上多组值,每组值用逗号分隔,这样能减少数据库交互次数,提升插入效率。
批量插入的示例如下:
-- 批量插入多条数据 INSERT INTO user_info (id, user_name, age) VALUES (3, '王五', 22), (4, '赵六', 30), (5, '孙七', 26);
插入数据时的常见注意事项
主键冲突处理
如果插入的数据主键已经存在,会直接报错中断操作。如果希望主键存在时更新其他列的值,可以使用INSERT ON CONFLICT语法,示例如下:
-- 主键冲突时更新user_name和age列 INSERT INTO user_info (id, user_name, age) VALUES (1, '张三更新', 26) ON CONFLICT (id) DO UPDATE SET user_name = EXCLUDED.user_name, age = EXCLUDED.age;
默认值的使用
如果表的列设置了默认值,插入时可以不指定该列,或者指定值为DEFAULT来显式使用默认值,示例如下:
-- 显式指定create_time使用默认值 INSERT INTO user_info (id, user_name, age, create_time) VALUES (6, '周八', 24, DEFAULT);
插入数据的返回值
如果需要获取插入后生成的自增主键或者其他列的值,可以在INSERT语句后加上RETURNING子句,示例如下:
-- 插入后返回插入的id和create_time INSERT INTO user_info (id, user_name, age) VALUES (7, '吴九', 29) RETURNING id, create_time;
插入结果验证
插入完成后可以通过SELECT语句验证数据是否插入成功,示例如下:
-- 查询所有插入的用户数据 SELECT * FROM user_info;
PostgreSQLinsert数据插入SQL语句修改时间:2026-06-23 18:15:27