我有一个用户回答问题的表格.规则是,用户可以回答许多问题,或者许多用户可以回答一个问题,但一个用户只能回答一个特定问题.如果用户再次回答这个问题,它应该简单地替换原来的问题.通常情况下,当我们处理唯一列时,on conflict do update会起作用.在这种情况下,列person_idquestion_id不能是唯一的.然而,两者的结合总是独一无二的.如何实现insert语句,该语句会根据冲突进行更新?

CREATE TABLE "answer" (
  "person_id" integer NOT NULL REFERENCES person(id), 
  "question_id" integer NOT NULL REFERENCES question(id) ON DELETE CASCADE, /* INDEXED */
  "answer" character varying (1200) NULL,
  PRIMARY KEY (person_id, question_id) 
);

推荐答案

只需将两个键都放在ON CONFLICT子句中:

INSERT INTO answer VALUES (1,1,'q1') 
ON CONFLICT (person_id,question_id) 
DO UPDATE SET answer = EXCLUDED.answer; 

例子:

INSERT INTO answer VALUES (1,1,'q1') 
ON CONFLICT (person_id,question_id) 
DO UPDATE SET answer = EXCLUDED.answer;             

SELECT * FROM answer;
 person_id | question_id | answer 
-----------+-------------+--------
         1 |           1 | q1
(1 Zeile)

INSERT INTO answer VALUES (1,1,'q1-UPDATED') 
ON CONFLICT (person_id,question_id) 
DO UPDATE SET answer = EXCLUDED.answer;             

SELECT * FROM answer;
 person_id | question_id |   answer   
-----------+-------------+------------
         1 |           1 | q1-UPDATED
(1 Zeile)

演示:db<>fiddle

Postgresql相关问答推荐

利用PostgreSQL查询中表的顺序来计算包含每次时间的时间范围

使用regexp获取表名

用于JSON数组的带有组合条件的Postgres JSONB Select 查询

是否可以在psql查询输出中删除新行末尾的+号?

如何将 jackc/pgx 与连接池、上下文、准备好的语句等一起使用

在 Age Viewer 上看不到 node 的第一个属性

gorm 创建并返回值 many2many

从网址获取第一个字符串

当我写 SELECT ~1;在 Postgresql 上它给了我 -2 结果.这是什么原因?它一直持续〜4和-5等

在 Ubuntu 11.04 服务器中启用对 postgresql 的 PHP 支持

当脚本工作时,Postgres now() 时间戳不会改变

升级到 OSX Mavericks 后修复 postgresql

断言错误:Django-rest-Framework

PostgreSQL CASE 在函数中的使用

在 postgreSQL 中更改序列名称

使用 current_setting() 判断值

Postgres - 如果找不到记录,则在更新时返回错误

如何语法判断 PostgreSQL 配置文件?

PGAdmin 编辑数据

如何在 psql 中设置默认显示模式