我有一个用户回答问题的表。规则是用户可以回答许多问题,或者许多用户可以回答一个问题,但用户只能回答一个特定的问题。如果用户再次回答该问题,它应该简单地替换旧的。2一般来说,当我们处理唯一的列时,on conflict do update可以工作。在这个场景中,列person_id
和question_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)
);
2条答案
按热度按时间bis0qfac1#
只需将两个键都放在
ON CONFLICT
子句中:示例:
演示:
db<>fiddle
PostgreSQL 15+版本
使用
MERGE
也可以获得相同的结果:演示:
db<>fiddle
c0vxltue2#
您还可以在表的外部定义主列,这样就不需要重写其中包含的所有列。
然后:
当约束将来发生变化时,您不需要手动调整insert语句来反映这一点。