2012-06-18 122 views
2

我有一個關係表與兩個指向同一個表的外鍵。轉換MySQL插入和更新到SQL Server觸發器

第一個外鍵列應始終是外部屬性的最小值,第二個外鍵最多。

我是SQL Server的新手,我讀到使用inserted臨時表的插入應該被使用,但是我應該如何設置最小和最大關係孩子不使用循環遍歷inserted條目。

表:

table Child 
{ 
    int id; 

    int value; 
} 

table Parent  
{ 
    int id; 

    // foreign-keys A enforce minimum child value! 
    int childA; 
    int childB; 
} 

MySql的觸發

CREATE TRIGGER parent_beforeInsert 
BEFORE INSERT ON Parent 
    FOR each ROW 
    BEGIN 
     DECLARE childAValue AS INT; 
     DECLARE childBValue AS INT; 

     SET childAValue = (SELECT value FROM Child WHERE ID = NEW.childA); 
     SET childBValue = (SELECT value FROM Child WHERE ID = NEW.childB); 

     -- only check if b > a since reverse is wished behavior 
     IF childBValue > childAValue 
     BEGIN 
      -- swap values    
      DECLARE newChildA AS INT = NEW.childA 
      SET NEW.childA = NEW.childB; 
      SET NEW.childB = newChildA; 
     END; 
    END; 
+1

SQL Server沒有'BEFORE INSERT'觸發器;你有'正常的'ON/AFTER INSERT'觸發器,或者你可以使用'INSTEAD OF INSERT'觸發器來執行,而不是你的INSERT語句。 –

+0

好吧,你可以從插入兩個連接,雖然沒有看到一個巨大的好處。不得不說,你正在試圖實施的「規則」,是很好的要求。 –

+0

看不到如何使用兩個連接來解決它。現在使用選擇條件'CASE ... THEN ... ELSE'解決它。 – djmj

回答

0

使用條件選擇查詢解決它。 不那麼優雅,特別是如果許多屬性需要設置,但它的工作原理。

INSERT INTO Parent (childA_ID, childB_ID) 
    SELECT CASE WHEN childA.value <= childB.value THEN childA.ID ELSE childB.ID END AS childA_ID, 
      CASE WHEN childA.value > childB.value THEN childA.ID ELSE childB.ID END AS childB_ID 
     FROM inserted AS p, 
      Child AS childA, 
      Child AS childB, 
     WHERE childA.ID = p.childA 
      AND childB.ID = p.childB;