PostgreSQL 的 INSERT 数据新增功能有哪些用法?

PostgreSQL, pgsql新增插入数据,存在则更新,不存则在新增插入,ON CONFLICT insert冲突处理 基本语法, 通过 INSERT ON CONFLICT 来使用 upsert 功能 upsert :(update or insert) INSERT INTO table_name(column_list) VALUES(value_list) ON CONFLICT target action; [Err] ERROR: duplicate key value violates unique constraint "kxstore_pkey" DETAIL: Key (id)=(137936381 阅读详情

PostgreSQL 的 INSERT 语句用于向数据库表中插入新数据,功能非常丰富,支持多种语法和高级特性。以下是 全面且详细的 INSERT 用法示例,涵盖基础到高级场景,均附带中文注释说明。


1. 基本插入:指定列名和值

-- 向 users 表插入一条新用户记录(推荐写法,明确字段)
INSERT INTO users (name, email, age, city)
VALUES ('张三', 'zhangsan@email.com', 25, '北京');

2. 插入所有列(省略列名)

-- 按表定义的列顺序插入所有字段值(不推荐,易出错)
INSERT INTO users
VALUES (1, '李四', 'lisi@email.com', 30, '上海', TRUE, NOW());

⚠️ 注意:必须提供所有列的值,且顺序一致,否则报错。


3. 插入多条记录(批量插入)

-- 一次性插入多个用户(高效,减少网络开销)
INSERT INTO users (name, email, age, city)
VALUES 
  ('王五', 'wangwu@email.com', 28, '广州'),
  ('赵六', 'zhaoliu@email.com', 32, '深圳'),
  ('孙七', 'sunqi@email.com', 24, '杭州');

4. 使用 DEFAULT 关键字插入默认值

-- 对某些字段使用默认值(如 created_at、is_active 等)
INSERT INTO users (name, email, age, city, created_at)
VALUES ('周八', 'zhouba@email.com', 27, '南京', DEFAULT);

5. 插入自增主键(SERIAL 或 IDENTITY)

-- id 为 SERIAL 或 GENERATED ALWAYS AS IDENTITY 时,使用 DEFAULT
INSERT INTO users (id, name, email)
VALUES (DEFAULT, '吴九', 'wujiu@email.com');

或者直接省略 id 字段:

INSERT INTO users (name, email) 
VALUES ('吴九', 'wujiu@email.com');

6. 使用 DEFAULT VALUES 插入全默认值

-- 如果所有字段都有默认值,可插入一行默认数据
INSERT INTO config_table DEFAULT VALUES;

7. 从查询结果插入数据(INSERT INTO … SELECT)

-- 将 temp_users 表中符合条件的用户迁移到 users 表
INSERT INTO users (name, email, age, city)
SELECT name, email, age, city 
FROM temp_users 
WHERE status = 'valid';

常用于数据迁移、归档、ETL 场景。


8. 使用 RETURNING 返回插入后的数据

-- 插入后返回生成的 id 和创建时间(常用于获取自增 ID)
INSERT INTO users (name, email)
VALUES ('郑十', 'zhengshi@email.com')
RETURNING id, name, created_at;

RETURNING 是 PostgreSQL 强大特性,避免额外查询。


9. 使用 CTE(公共表表达式)插入并返回

-- 先准备数据,再插入并返回结果
WITH new_users AS (
    SELECT '小明' AS name, 'xiaoming@school.com' AS email, 12 AS age
    UNION ALL
    SELECT '小红', 'xiaohong@school.com', 11
)
INSERT INTO users (name, email, age)
SELECT name, email, age FROM new_users
RETURNING id, name, email;

10. 使用序列(Sequence)手动指定 ID

-- 手动从序列获取下一个值
INSERT INTO users (id, name, email)
VALUES (nextval('users_id_seq'), '刘十一', 'liushiyi@email.com');

适用于需要控制 ID 生成逻辑的场景。


11. 插入 JSON 数据(JSON/JSONB 类型)

-- 向 profile 字段(JSONB 类型)插入结构化数据
INSERT INTO users (name, email, profile)
VALUES (
  '陈十二', 
  'chenshi'er@email.com', 
  '{"phone": "13800138000", "address": "北京市朝阳区", "hobbies": ["读书", "游泳"]}'::jsonb
);

12. 插入数组数据

-- hobbies 字段为 TEXT[] 类型
INSERT INTO users (name, email, hobbies)
VALUES ('钱十三', 'qiansanshi@email.com', ARRAY['唱歌', '跳舞', '编程']);

13. 条件插入:使用 INSERT … ON CONFLICT(UPSERT)

-- 如果 email 冲突,则更新 name 和 updated_at(类似 MySQL 的 ON DUPLICATE KEY UPDATE)
INSERT INTO users (email, name, age)
VALUES ('exist@email.com', '新名字', 30)
ON CONFLICT (email) 
DO UPDATE SET 
    name = EXCLUDED.name,
    age = EXCLUDED.age,
    updated_at = NOW();

EXCLUDED 表示尝试插入的那行数据。


14. 冲突时忽略插入(DO NOTHING)

-- 如果 email 已存在,则不执行任何操作(静默忽略)
INSERT INTO users (email, name)
VALUES ('test@email.com', '测试用户')
ON CONFLICT (email) DO NOTHING;

常用于防止重复插入。


15. 指定冲突的约束名进行处理

-- 假设有一个唯一约束名为 uk_users_username
INSERT INTO users (username, name)
VALUES ('admin', '管理员')
ON CONFLICT ON CONSTRAINT uk_users_username 
DO UPDATE SET name = EXCLUDED.name;

16. 插入时设置时区或时间戳

-- 使用带时区的时间
INSERT INTO logs (message, created_at)
VALUES ('系统启动', NOW() AT TIME ZONE 'Asia/Shanghai');

17. 使用 generate_series 生成测试数据

-- 快速插入 100 条测试用户
INSERT INTO users (name, email)
SELECT 
  '用户' || g AS name,
  'user' || g || '@test.com' AS email
FROM generate_series(1, 100) AS g;

18. 插入时调用函数或表达式

-- 插入时自动计算字段值
INSERT INTO users (name, email, age, birth_year)
VALUES (
  '吴十五',
  LOWER('WuShiwu@Email.com'),  -- 转小写
  EXTRACT(YEAR FROM NOW()) - 1990,
  1990
);

19. 使用 DEFAULT 和表达式混合

INSERT INTO users (name, email, age, created_at, is_active)
VALUES (
  '郑十六',
  'zheng16@email.com',
  25,
  NOW(),
  DEFAULT  -- 使用 is_active 的默认值(如 true)
);

20. 插入大对象或二进制数据(BYTEA)

-- 插入图片或文件的二进制数据
INSERT INTO files (filename, data)
VALUES ('logo.png', decode('89504E470D0A...', 'hex'));

decode('hex') 用于将十六进制字符串转为 BYTEA。


21. 使用规则(Rule)或触发器(Trigger)自动处理插入

-- 创建触发器:插入时自动设置 created_at
CREATE OR REPLACE FUNCTION set_created_at()
RETURNS TRIGGER AS $$
BEGIN
    NEW.created_at = NOW();
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_set_created_at
    BEFORE INSERT ON users
    FOR EACH ROW EXECUTE FUNCTION set_created_at();

22. 插入时使用 WITH(CTE)预处理数据

-- 先计算平均年龄,再插入新用户
WITH avg_age AS (
    SELECT AVG(age) AS avg_val FROM users
)
INSERT INTO users (name, email, age)
SELECT '新用户', 'new@company.com', CEIL(avg_val)
FROM avg_age
RETURNING id, name, age;

23. 使用 COPY 命令快速批量导入(非 INSERT,但属于插入功能)

-- 从 CSV 文件快速导入数据(高性能)
COPY users (name, email, age) FROM '/path/to/users.csv' WITH (FORMAT csv, HEADER true);

COPY 比 INSERT 快得多,适合大数据量导入。


总结:PostgreSQL INSERT 功能对比

方法适用场景是否支持 RETURNING是否支持条件性能
INSERT VALUES单条或多条插入✅❌中
INSERT SELECT从查询结果插入✅✅高
INSERT ON CONFLICT防止重复插入(Upsert)✅✅中
COPY大批量导入❌❌极高
CTE + INSERT复杂逻辑插入✅✅中

✅ 最佳实践建议

  1. 始终指定列名:避免因表结构变化导致错误。
  2. 使用 ON CONFLICT 替代先查后插:避免竞态条件。
  3. 批量插入用 VALUES (...), (...), ...:减少事务开销。
  4. 大容量导入用 COPY:性能远超 INSERT。
  5. 关键操作使用 RETURNING:减少查询次数。
  6. 生产环境插入前测试:防止数据类型或约束错误。

PostgreSQL 的 INSERT 功能不仅支持基础插入,还提供 Upsert、CTE、RETURNING、JSON、数组、批量插入 等强大特性,是构建健壮数据写入逻辑的核心工具。

PostgreSQL merge insert(upsert/insert into on conflict) 如何区分数据是INSERT还是UPDATE 背景使用insert into on conflict update语法,可以支持UPSERT的功能,但是到底这条SQL是插入的还是更新的呢?如何判断 通过xmax字段的值是否不为0,可以判断,如果是UPDATE,XMAX里面会填充更新事务号。 注意直接用UPDATE语句更新的话,XMAX会写入0,因为是新版本,而老版本上XMAX会填入更新事务号。 例子... 阅读详情

相关推荐

PostgreSQL使用pg_dump导出单个数据表的insert语句

PostgreSQL自带的pgadmin4工具没有办法生成数据表的insert语句,这使得想要提取单个表的数据,插入到不同环境的相同表中变成很麻烦的一件事,使用PostgreSQL的pg_dump工具可以实现该功能。 目录 使用效果 操作过程 参考资料 使用效果 截图1.在空的表中执行导出的sql文件 截图2.插入的数据 使用pg_dump导出的sql语句文件,直接在数据库中\i 执行,即可成功插入数据。 操作过程 截图3.导出sql语句 截图4.生成的SQL文件内容 命令.

Gam's Blog 8914

PostgreSQL11 | 插入、更新与删除数据

本文根据原书《PostgreSql11 从入门到精通》(清华大学出版社)第7章总结整理,为提问与解答可以帮助更多人,本博客模拟GitHub的issue方案,所以私信已关,有问题请在评论区直接指正与提问,允许转发、复制或引用本文章,必须遵守开源法则注释来源与作者,感谢您的阅读。

红星编程实验室 1万+

PostgreSQL INSERT ON CONFLICT DO ... 不存在则插入、存在则更新

首先声明: 本篇博客参考博主:DemonHunter211的博客: PostgreSQL upsert功能(insert on conflict do)的用法,如有侵权请联系删除! PostgreSQL 9.5 中引入了一项新功能,UPSERT(insert on conflict do),当插入遇到约束错误时,直接返回或者改为执行UPDATE,通过UPSERT就可以实现不存在则插入、存在则更新的功能; 语法如下: Command: INSERT Description: create new row

林胖的专栏 2862

PostgreSQL INSERT INTO 语句

PostgreSQL INSERT INTO 语句 PostgreSQL INSERT INTO 语句用于向表中插入新记录。 我们可以插入一行也可以同时插入多行。 语法 INSERT INTO 语句语法格式如下: INSERT INTO TABLE_NAME (column1, column2, column3,...columnN) VALUES (value1, value2, value3,...valueN); column1, column2,…columnN 为表中字段名。 value1,

HighGO 3490

PostgreSQL的insert解析

其insert由函数heapam_tuple_insert完成。 1、首先需要从slot中取出tuple值,HeapTupleTableSlot.tuple 2、从relation中得到该记录即将插入表的OID:relation->rd_id,然后slot->tts_tableOid和tuple->t_tableOid更新为该OID 3、调用heap_insert将tu...

帅的数说 2528

PostgreSQL的学习心得和知识总结(十四)|语法级自上而下完美实现Oracle数据库INSERT ALL/FIRST功能

目录结构 PostgreSQL真正的 insert all/first文章快速说明索引Oracle的插入示例gram.y的语法解析SQL语法设计实现insert all 语法设计与实现insert all when设计与实现insert first when 设计实现新增语法结果测试 文章快速说明索引 学习目标: 在PostgreSQL上实现Oracle数据库的 insert all/first 功能,这里的实现不是说使用某些CTE的功能来 曲线救国 地实现类似功能。而是将执行与在Orac.

孤傲小二~阿沐的博客 2662

7.PostgreSQL操作语句

PostgreSQL INSERT INTO 语句用于向表中插入新记录。我们可以插入一行也可以同时插入多行。

wujianyouhun的专栏 2139

PMOS过压保护电路设计与仿真优化策略

本文深入探讨PMOS过压保护电路(OVP)的设计与仿真优化策略,详细解析PMOS管选型、稳压管特性及三极管配置等关键要素。通过Proteus仿真案例揭示典型设计误区,并提供响应速度提升、抗干扰设计等进阶优化方案,助力工程师实现高可靠性的电源保护系统设计。

weixin_42620340的博客 438

在 PostgreSQL 通过Select语句中动态生成 INSERT 和 UPDATE 语句

本文介绍了如何使用 PostgreSQL 动态生成INSERT和UPDATE语句,使用了unnest()array[]和等函数。通过这些函数的组合,能够轻松生成动态 SQL 语句,适用于多种场景,包括数据备份、迁移、调试等,提高数据操作的便捷性。

www_tlj的专栏 1977

Notepad++ XML Tools插件:手把手教你格式化混乱XML与一键语法检查(保姆级教程)

本文详细介绍了如何使用Notepad++的XML Tools插件格式化混乱的XML文件并进行一键语法检查。通过插件安装、格式化实战和语法排错的完整流程,帮助开发者高效处理XML数据,提升API通信和数据存储的工作效率。特别适合需要快速验证和整理XML配置的开发人员。

weixin_42619742的博客 322

【顾邦小讲堂】第十九期 RC Snubber吸收电路详解:抑制MOSFET振铃现象与过冲的设计技巧!

通过RC Snubber电路有效抑制MOSFET DS端的过冲及振铃现象,帮助工程师们在设计中提升电路的稳定性和可靠性

GBupupup的博客 3783

ShardingSphere即将支持PostgreSQL代理

作者简介张永伦,京东数科高级软件工程师,Apache ShardingSphere(Incubating) PPMC。长期从事分布式系统的高可用、高并发相关工作。热衷于网...

ShardingSphere官微 1526

STC8单片机高精度EV1527解码实战:定时器捕获+状态机抗干扰方案

EV1527是一种广泛应用于433MHz无线遥控的曼彻斯特编码协议,其核心在于对脉宽时序(如同步头、逻辑0/1)的微秒级精确识别。传统外部中断+延时判别方式受MCU中断延迟、编译优化及环境噪声影响,极易导致误码;而基于硬件定时器输入捕获的解码方案,将时间测量交由硬件完成,显著提升时序鲁棒性与温度/电压适应性。该技术适用于STC8等无专用无线解码外设的8位单片机,在智能开关、晾衣架、车库门控等IoT终端中实现低至0.003%的稳定误码率。本文聚焦STC8H系列利用T1定时器下降沿捕获与有限状态机协同解码EV1

weixin_29188997的博客 180

PostgreSQL INSERT INTO 语句详解

PostgreSQL 的语句是数据库操作中最基础且最重要的命令之一,用于向表中添加新记录。该语句支持单行插入、多行插入、部分字段插入等多种灵活用法。PostgreSQL的INSERT INTO语句提供了灵活多样的数据插入方式,掌握其各种用法和优化技巧对于高效数据库操作至关重要。理解基本语法和变体形式掌握批量插入提高效率学会处理插入冲突遵循安全最佳实践了解性能优化方法通过合理应用INSERT语句,可以构建高效可靠的数据写入流程,为应用系统提供坚实的数据存储基础。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1万+

毫米波与太赫兹:十射线模型建模

Pt=1,只考虑地面和前后两面墙的反射,反射系数为0.7。用matlab设计程序并实现该功能。,总计考虑10条路径,求出接收功率随。

SupermarketX的博客 785

Aurora8b10b光口通信实战:复位时序与IP核配置详解

本文深入解析了Aurora 8B10B协议在FPGA高速光口通信中的核心实践,重点剖析了确保链路稳定启动的关键复位时序与IP核配置细节。通过详解全双工与单工模式下的复位流程、Vivado中IP核的物理层与链路层参数设置,并结合用户逻辑设计实例,为工程师实现可靠的高速数据传输提供了清晰的实战指南。

weixin_29280219的博客 177

PostgreSQL的upsert功能(insert on conflict do)的用法

建表语句: DROP TABLE IF EXISTS "goods"; CREATE TABLE "goods" ( "store_cd" int4 NOT NULL, "good_cd" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, "name" varchar(255) COLLATE "pg_catalog"."de...

小妖666个人笔记 1万+

GSview5.0安装步骤及问题

GSview5.0安装步骤及问题安装步骤遇到的问题 尝试过很多对图片去白边的方法,感觉最好用最有效的还是用GSview比较好操作。本文针对gsview安装及安装过程中踩过的坑记录下来。 安装步骤 在官网下载gsv50w64.exe(或32位的),直接双击安装即可。 安装Ghostscript;注意:GSview5.0不支持最新版的Ghostscript9.54,这里用到是9.27的版本可以在Github中找到,下载gs927w64.exe,一定要安装在GSview的安装目录Ghostgum下 Gho

LilianLYN的博客 1万+

PostgreSQL upsert功能(insert on conflict do)的用法

标签 PostgreSQL , upsert , insert on conflict do 背景 PostgreSQL 9.5 引入了一项新功能,UPSERT(insert on conflict do),当插入遇到约束错误时,直接返回,或者改为执行UPDATE。 语法如下 Command: INSERT Description: create new rows in a...

kwame211的博客 2万+

Transformers 实战修炼与源码剖析专栏大纲

本专栏以 Hugging Face Transformers 为主线,围绕“能用、会调、敢上线、懂源码”四个目标展开。内容不把理论堆成公式墙,而是用真实或拟真的业务场景驱动:客服分类、合同抽取、知识库问答、模型微调、推理服务、监控告警、源码扩展等。采用“业务痛点 → 三人剧本对话 → 代码实战 → 总结思考”的四段式结构,让读者在动手完成一个个小项目的过程中,逐步理解 Tokenizer、Model、Pipeline、Trainer、Generation、PEFT、Accelerate、Serving等概念

davidwang456的专栏 921

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

PostgreSQL - INSERT 插入数据的多种方式与注意事项

PostgreSQL INSERT操作指南 摘要: 本文详细介绍了PostgreSQL中INSERT语句的多种使用方式,包括基础语法、批量插入和条件插入等实用技巧。主要内容涵盖: 基础语法解析:介绍INSERT语句的基本结构、列名列表和RETURNING子句的使用方法。 多种插入方式: 单行数据插入 多行数据批量插入 结合函数和表达式的插入 从其他表查询结果插入数据 使用CTE进行预处理后插入 冲突处理机制:重点讲解ON CONFLICT子句的两种处理方式: DO NOTHING:忽略冲突 DO UPDAT

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

PostgreSQL insert update 常用操作及insert用法区别

创建测试数据表 create table student ( id int constraint idx_id primary key, name varchar(20) constraint cst_name not null ); 插入数据 insert into student values(1,'lens'); 1. 根据字段,当id冲突时更新name值 insert into student values(1,'y5935') ON CONFLICT(id) d...

qq_654603797 5775

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【PostgreSQL】PostgreSQL的upsert功能(insert on conflict do)的用法

PostgreSQL 的 upsert 功能:当记录不存在时,执行插入;否则,进行更新。

fuyun6363的博客 5205
上一篇: PostgreSQL 的 DELETE 数据删除功能有哪些用法?
下一篇: 电商系统中购物车的创建时机是什么时候?
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值