postgres 插入冲突错误 - 没有唯一或排除约束

Cha*_*dra 7 sql postgresql insert-update

daily_report我在 postgres和中有两个表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 ;  
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

错误:没有与 ON CONFLICT 规范匹配的唯一或排除约束

Bla*_*lag 10

要使用你需要在你的桌子上on conflict强制执行:unique(userid, songd)summary_songs

SQL小提琴

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);
Run Code Online (Sandbox Code Playgroud)

查询1

select * from daily_report 
Run Code Online (Sandbox Code Playgroud)

结果

|  date_time | userid | songd | countid |
|------------|--------|-------|---------|
| 2017-12-31 |      1 |     1 |       5 |
| 2017-12-31 |      2 |     1 |      10 |
| 2017-12-31 |      4 |     1 |       7 |
Run Code Online (Sandbox Code Playgroud)

查询2

select * from summary_songs 
Run Code Online (Sandbox Code Playgroud)

结果

|  date_time | userid | songd | countid |
|------------|--------|-------|---------|
| 2017-12-30 |      1 |     1 |      80 |
| 2017-12-30 |      2 |     1 |      51 |
| 2017-12-30 |      3 |     1 |      66 |
Run Code Online (Sandbox Code Playgroud)

查询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
Run Code Online (Sandbox Code Playgroud)

查询4

select * from summary_songs 
Run Code Online (Sandbox Code Playgroud)

结果

|  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 |
Run Code Online (Sandbox Code Playgroud)