[英]postgres insert on conflict error - there is no unique or exclusion constraint
I have two tables in postgres daily_report
and summary_songs
.我在 postgres
daily_report
和summary_songs
中有两个表。
Sql file for creating the tables is here: https://nofile.io/f/Ef94rMFRh6C/file.sql用于创建表的 SQL 文件位于: https ://nofile.io/f/Ef94rMFRh6C/file.sql
I want to update the summary_songs
at the end of each day with below conditions:我想在每天结束时使用以下条件更新
summary_songs
:
userid
already does not exist, then record from daily_report
need to be inserted into summary_songs
userid
已经不存在,则需要将daily_report
中的记录插入到summary_songs
中userid
exists, then summary_songs.countid = summary_songs.countid+ daily_report.countid
.userid
存在,则summary_songs.countid = summary_songs.countid+ daily_report.countid
。 I used below query to update summary_songs
:我使用以下查询来更新
summary_songs
:
insert into summary_songs
(select * from daily_report as B)
on conflict (userid, songd)
do update set countid = countid+excluded.countid ;
I get below error:我收到以下错误:
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
错误:没有匹配 ON CONFLICT 规范的唯一或排除约束
To use on conflict
you need to enforce a unique(userid, songd)
on your summary_songs
table:要
on conflict
使用,您需要在summary_songs
表上强制执行unique(userid, songd)
:
PostgreSQL 9.6 Schema Setup : PostgreSQL 9.6 架构设置:
CREATE TABLE summary_songs (
date_time date NOT NULL,
userid integer NOT NULL,
songd integer NOT NULL,
countid integer NOT NULL,
unique(userid, songd)
);
CREATE TABLE daily_report(
date_time date NOT NULL,
userid integer NOT NULL,
songd integer NOT NULL,
countid integer NOT NULL
);
insert into daily_report (date_time, userid, songd, countid) values
(to_date('2017-12-31','YYYY-MM-DD'), 1 , 1 , 5),
(to_date('2017-12-31','YYYY-MM-DD'), 2 , 1 , 10),
(to_date('2017-12-31','YYYY-MM-DD'), 4 , 1 , 7);
insert into summary_songs (date_time, userid, songd, countid) values
(to_date('2017-12-30', 'YYYY-MM-DD'),1, 1, 80),
(to_date('2017-12-30', 'YYYY-MM-DD'),2, 1, 51),
(to_date('2017-12-30', 'YYYY-MM-DD'),3, 1, 66);
Query 1 :查询 1 :
select * from daily_report
| date_time | userid | songd | countid |
|------------|--------|-------|---------|
| 2017-12-31 | 1 | 1 | 5 |
| 2017-12-31 | 2 | 1 | 10 |
| 2017-12-31 | 4 | 1 | 7 |
Query 2 :查询 2 :
select * from summary_songs
| date_time | userid | songd | countid |
|------------|--------|-------|---------|
| 2017-12-30 | 1 | 1 | 80 |
| 2017-12-30 | 2 | 1 | 51 |
| 2017-12-30 | 3 | 1 | 66 |
Query 3 :查询 3 :
insert into summary_songs (date_time, userid, songd, countid)
select date_time, userid, songd, countid from daily_report
on conflict (userid, songd)
do update set
countid = summary_songs.countid + excluded.countid ,
date_time = excluded.date_time
Query 4 :查询 4 :
select * from summary_songs
| date_time | userid | songd | countid |
|------------|--------|-------|---------|
| 2017-12-30 | 3 | 1 | 66 |
| 2017-12-31 | 1 | 1 | 85 |
| 2017-12-31 | 2 | 1 | 61 |
| 2017-12-31 | 4 | 1 | 7 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.