2016-06-10 70 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) 
); 
相關問題