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

发布时间 2023-12-27 11:33:14作者: soldier77

概述:ON CONFLICT 是将新数据插入现有表时处理唯一性冲突的一种方式

快速预览
1. DO UPDATE SET: 重复则更新
2. DO NOTHING: 重复则跳过

先创建表t_daily_stats、并且主键字段由serial_no、date组成,以及其他字段

-- 创建设备每日统计表 
CREATE TABLE t_daily_stats (
    serial_no VARCHAR(50) NOT NULL,
    date DATE NOT NULL,
    online_time INT DEFAULT 0,
    last_status INT NOT NULL,
    update_time TIMESTAMP NOT NULL,
    PRIMARY KEY (serial_no, date) --确保每个设备每天只有一条记录
     );

执行插入测试:

正常插入数据SQL语句

INSERT INTO t_daily_stats(serial_no, "date", online_time, last_status, update_time)
VALUES('0007', '2023-12-26', 0, 0, CURRENT_TIMESTAMP);

查看数据

 可以看到数据已经插入到表中了,如果在插入同样的数据,就会出现重复键异常

主键重复插入报错,解决方案有三个
1. 不插入重复数据
2. 插入重复数据则更新,不存在插入
3. 插入重复数据,则跳过

重复则更新

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

SQL语句

 

INSERT INTO t_daily_stats(serial_no, "date", online_time, last_status, update_time)
VALUES('0007', '2023-12-26', 0, 1, CURRENT_TIMESTAMP)
ON CONFLICT(serial_no, "date")
DO UPDATE SET
    last_status = EXCLUDED.last_status

 

查看数据

重复则跳过

INSERT INTO t_daily_stats(serial_no, "date", online_time, last_status, update_time)
VALUES('0007', '2023-12-26', 0, 1, CURRENT_TIMESTAMP)
ON CONFLICT(serial_no, "date")
DO NOTHING

查看结果

 结束

 

 

 

 

 

serial_no, "date"