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

时间:2018-03-03 21:42:58

标签: sql postgresql insert-update

我在postgres daily_reportsummary_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规范匹配的唯一或排除约束

1 个答案:

答案 0 :(得分:0)

要使用on conflict,您需要在unique(userid, songd)表格上强制执行summary_songs

SQL Fiddle

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 |