PostgreSQL级联更新many_to_many关系

时间:2017-04-08 15:37:22

标签: sql postgresql many-to-many relationships

我有3个表格来构成my many_to_many关系servicesappointmentsappointment_service。现在我想弄清楚如何在更新约会时更新appointmentsappointment_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是否有一些帮助方法以更清洁的方式实现这一目标?

1 个答案:

答案 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