2016-06-10 72 views
0

我有如下表推荐的方式来处理更新的M2M表的Postgres

  1. 一个项目表

    PROJECT_ID,PROJECT_NAME

  2. 技能表

    skill_id也,skill_name

  3. project_skill ta BLE(多对多的关系)

    project_skill_id,PROJECT_ID,skill_id也

该浏览器将具有要求用户输入项目名称,并和标记,这样的风格自动完成表单。我送下面的JSON格式回SQL插入

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

我的问题涉及到用户获取编辑现有project.Assuming用户从技能移除“巴兹”和包括“ZED”的情况。如何正确处理更新多对多表

{"project_name":"foo","skills":["bar","zed","biz"]} 
  1. 我是否从M2M表中删除所有记录,并做了新鲜插入新的技能?
    • 删除基于PROJECT_ID所有记录
    • 插杆,捷思,BIZ
  2. 我想和你在什么被删除/添加和删除只什么实际删除服务器的新记录
      从表
    • 删除巴兹
    • 附加BIZ

这也涉及到修改PROJECT_NAME等检查我什么修改和更新必要的或执行完整的删除和插入

回答

0

我会使用一个CTE用MERGE(注意,这是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) 
); 
相关问题