概述: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"标签:PostgreSQL,no,数据库,插入,time,date,last,serial,重复记录 From: https://www.cnblogs.com/whyq1314/p/17930217.html