【问题标题】:Recommended way to deal with updating m2m table postgres处理更新 m2m 表 postgres 的推荐方法
【发布时间】:2016-06-12 22:12:18
【问题描述】:

我有下表

  1. 一个项目表

    project_id,project_name

  2. 技能表

    skill_id,skill_name

  3. 一个 project_skill 表(多对多关系)

    project_skill_id,project_id,skill_id

浏览器会有一个表单,要求用户输入项目名称和标签的 SO 样式自动完成。我将以下 json 格式发送回 sql 以供插入

{"project_name":"foo","skills":["bar","baz"]}

我的问题与用户编辑现有项目的情况有关。假设用户从技能中删除“baz”并包含“zed”。我如何正确处理更新多对多表

{"project_name":"foo","skills":["bar","zed","biz"]}
  1. 我是否从 m2m 表中删除所有记录并使用新技能重新插入?
    • 根据 project_id 删除所有记录
    • 插入 bar、zed、biz 的新记录
  2. 我是否在服务器中检查删除/添加的内容并仅删除实际删除的内容
    • 从表中删除 baz
    • 添加业务

这也与修改 project_name 等有关。我是否检查已修改的内容并更新必要的内容或执行完整的删除和插入

【问题讨论】:

    标签: sql node.js postgresql


    【解决方案1】:

    我会使用带有 MERGE 的 CTE(注意这是 SQL Server,但 Postgres 应该类似):

    ;WITH src AS
    (
        SELECT p.project_id, s.skill_id
        FROM
        dbo.project AS p
        INNER JOIN @input AS i ON p.project_name = i.project_name
        INNER JOIN dbo.skill AS s ON i.skill_name = s.skill_name
    )
    MERGE INTO dbo.project_skill AS tgt
    USING src
    ON tgt.project_id = src.project_id AND tgt.skill_id = src.skill_id
    WHEN NOT MATCHED BY TARGET THEN
        INSERT (project_id, skill_id) VALUES (src.project_id, src.skill_id)
    WHEN NOT MATCHED BY SOURCE THEN
        DELETE;
    

    其中@input 包含新值:

    DECLARE @input TABLE
    (
        project_name VARCHAR(100),
        skill_name VARCHAR(100)
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      相关资源
      最近更新 更多