前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PostgreSQL数据库中插入数据并跳过重复记录

PostgreSQL数据库中插入数据并跳过重复记录

作者头像
不止于python
发布2023-11-16 11:28:18
7490
发布2023-11-16 11:28:18
举报
文章被收录于专栏:不止于python不止于python

直接开始

代码语言:javascript
复制
快速预览
1. DO UPDATE SET: 重复则更新
2. DO NOTHING: 重复则跳过

创建表

首先,创建一个表(people),并且主键由字段 nameagegender 组成,以及其它字段(例如 addresscomment)等。

SQL语句

代码语言:javascript
复制
CREATE TABLE people (
    name VARCHAR(100),
    age INT,
    gender CHAR(1),
    address TEXT,
    comment TEXT,
    PRIMARY KEY (name, gender, age)
);

查看表结构

代码语言:javascript
复制
test=# \d people
                       Table "public.people"
 Column  |          Type          | Collation | Nullable | Default
---------+------------------------+-----------+----------+---------
 name    | character varying(100) |           | not null |
 age     | integer                |           | not null |
 gender  | character(1)           |           | not null |
 address | text                   |           |          |
 comment | text                   |           |          |
Indexes:
    "people_pkey" PRIMARY KEY, btree (name, gender, age)

\d 可以查看表结构,这样具有三个字段组合作为主键的表就建好了。

执行插入测试

正常插入数据

SQL语句

代码语言:javascript
复制
INSERT INTO people (name, age, gender, address, comment)
VALUES ('张三', 30, 'M', '唧唧王国', '程序员')

查看数据

代码语言:javascript
复制
test=# select * from people;
 name | age | gender | address  | comment
------+-----+--------+----------+---------
 张三 |  30 | M      | 唧唧王国 | 程序员
(1 row)

可以看到数据已经插入到表中了, 当再次插入时就会报错如下:

SQL语句

代码语言:javascript
复制
test=# INSERT INTO people (name, age, gender, address, comment)
VALUES ('张三', 30, 'M', '唧唧王国', '程序员');
ERROR:  duplicate key value violates unique constraint "people_pkey"
DETAIL:  Key (name, gender, age)=(张三, M, 30) already exists.

NOTE

代码语言:javascript
复制
主键重复插入报错, 解决这个问题有三个方案
1. 不插入重复数据
2. 插入重复数据更新, 不存在插入
3. 插入重复数据, 则跳过

重复则更新

在实际开发中, 有时会使用到如果存在则更新数据的场景, 这个时候就可以使用DO UPDATE SET关键字

SQL语句

代码语言:javascript
复制
INSERT INTO people (name, age, gender, address, comment)
VALUES ('张三', 30, 'M', '唧唧王国', '老程序员')
ON CONFLICT (name, gender, age) 
DO UPDATE SET 
    address = EXCLUDED.address,
    comment = EXCLUDED.comment;

查看数据

代码语言:javascript
复制
test=# select * from people;
 name | age | gender | address  | comment
------+-----+--------+----------+----------
 张三 |  30 | M      | 唧唧王国 | 老程序员
(1 row)

可以看到数据已经被更新了, 再来插入一条不存在的数据测试

SQL语句

代码语言:javascript
复制
INSERT INTO people (name, age, gender, address, comment)
VALUES ('李四', 25, 'M', '毛里求斯', '程序员')
ON CONFLICT (name, gender, age) 
DO UPDATE SET 
    address = EXCLUDED.address,
    comment = EXCLUDED.comment;

查看数据

代码语言:javascript
复制
test=# select * from people;
 name | age | gender | address  | comment
------+-----+--------+----------+----------
 张三 |  30 | M      | 唧唧王国 | 老程序员
 李四 |  25 | M      | 毛里求斯 | 程序员
(2 rows)

这条语句可以实现不存在则插入, 存在则更新功能

重复则跳过

还有些时候, 需要这种操作, 如果重复就跳过, 不希望报错也不需要更新更不能影响代码流程, 就可以使用DO NOTHING关键字

SQL语句

代码语言:javascript
复制
INSERT INTO people (name, age, gender, address, comment)
VALUES ('张三', 30, 'M', '唧唧王国', '程序员')
ON CONFLICT (name, gender, age) 
DO NOTHING;

查看数据

代码语言:javascript
复制
test=# select * from people;
 name | age | gender | address  | comment
------+-----+--------+----------+----------
 张三 |  30 | M      | 唧唧王国 | 老程序员
 李四 |  25 | M      | 毛里求斯 | 程序员
(2 rows)

执行了sql语句后, 没有报错, 而且数据也并没有被更新, 同样, 插入一条不存在的数据测试

SQL语句

代码语言:javascript
复制
INSERT INTO people (name, age, gender, address, comment)
VALUES ('王五', 28, 'M', '青青草原', '村长')
ON CONFLICT (name, gender, age) 
DO NOTHING;

查看数据

代码语言:javascript
复制
test=# select * from people;
 name | age | gender | address  | comment
------+-----+--------+----------+----------
 张三 |  30 | M      | 唧唧王国 | 老程序员
 李四 |  25 | M      | 毛里求斯 | 程序员
 王五 |  28 | M      | 青青草原 | 村长
(3 rows)

结束了!!!

根据开发场景选择不同的处理方式, 当然还有其它的解决方式, 这里并没有列举全, 只是这种方式更简单更高效, 就这样吧~

一直在努力, 记得点个在看哦!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 不止于python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 直接开始
  • 创建表
  • 执行插入测试
  • NOTE
  • 重复则跳过
  • 结束了!!!
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档