我在postgres daily_report
和summary_songs
中有两个表。
用于创建表的Sql文件位于:https://nofile.io/f/Ef94rMFRh6C/file.sql
我想在每天结束时使用以下条件更新summary_songs
:
userid
已经不存在,则需要将daily_report
中的记录插入summary_songs
userid
存在,则summary_songs.countid = summary_songs.countid+ daily_report.countid
。我使用以下查询来更新summary_songs
:
insert into summary_songs
(select * from daily_report as B)
on conflict (userid, songd)
do update set countid = countid+excluded.countid ;
我得到以下错误:
错误:没有与ON CONFLICT规范匹配的唯一或排除约束
答案 0 :(得分:0)
要使用on conflict
,您需要在unique(userid, songd)
表格上强制执行summary_songs
:
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);
查询1 :
select * from daily_report
<强> Results 强>:
| date_time | userid | songd | countid |
|------------|--------|-------|---------|
| 2017-12-31 | 1 | 1 | 5 |
| 2017-12-31 | 2 | 1 | 10 |
| 2017-12-31 | 4 | 1 | 7 |
查询2 :
select * from summary_songs
<强> Results 强>:
| date_time | userid | songd | countid |
|------------|--------|-------|---------|
| 2017-12-30 | 1 | 1 | 80 |
| 2017-12-30 | 2 | 1 | 51 |
| 2017-12-30 | 3 | 1 | 66 |
查询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
查询4 :
select * from summary_songs
<强> Results 强>:
| 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 |