我有3个表格来构成my many_to_many
关系services
,appointments
,appointment_service
。现在我想弄清楚如何在更新约会时更新appointments
和appointment_service
表,特别是在约会的服务更新时(如在服务中可以添加或从约会中删除) )。
表格结构如下:
appointments:
- id
- title
services:
- id
- name
appointment_service:
- id
- appointment_id
- service_id
我的第一个实现是删除appointment_service
中与我必须更新的约会id
匹配的所有行:
DELETE FROM appointment_service WHERE appointment_id = ?;
然后将所有“更新”服务添加回数据透视表:
WITH appointment as (UPDATE appointments SET column = ? WHERE id = ? RETURNING *)
INSERT INTO appointment_service(id, appointment_id, service_id)
VALUES (?, (select appointment.id from appointment), ?)
这有效;但是,我想将这两个查询转换为1,因此如果删除appointment_service
成功但更新appointments
查询失败,我不必返回并手动重新插入{{{ 1}}。还有一个更好的方法来解决这个问题吗? PostgreSQL是否有一些帮助方法以更清洁的方式实现这一目标?
答案 0 :(得分:0)
如何使用数组将n-to-n链接表降级为1-to-n表。
new
这种方式直接更新关系时,删除后不插入。 只是
| appid int | srvids int[] |
| 1 | [5,4,6] |
| 2 | [7,6] |
doc可以找到更多操作。
这实际上不是-- Delete / Append
UPDATE app_srv_rel
SET srvid = array_remove(srvids, old_srvid ) / (srvids || new_srvid)
WHERE appid = x
-- Update
UPDATE app_srv_rel
SET srvid = array_replace(srvids, old_id, new_id )
WHERE appid = x
-- list all srvid 10 appids
SELECT * FROM app_srv_rel
WHERE ARRAY[srvid] <@ srvids
,大部分时间都是cross-tab aggregation。