2

同じテーブルを指す 2 つの外部キーを持つリレーショナル テーブルがあります。

最初の外部キー列は常に外部プロパティの最小値であり、2 番目の列は最大値でなければなりません。

私は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;
4

1 に答える 1

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;
于 2012-06-29T14:53:19.973 に答える