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_songsuserid存在,则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
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)
| 归档时间: |
|
| 查看次数: |
18812 次 |
| 最近记录: |