1

Couple次のフィールドを持つと呼ばれるテーブルがありますCoupleId, HusbandId , WifeId , StartDate , EndDate

前の表にはカップルに関する情報が含まれています。これCoupleIdは主キーです

HusbandIdおよびWifeIdは、名前が付けられた別のテーブルを形成する外部キーです。Person

StartDateとの男性と女性EndDateの間で発生する結婚の開始/終了日を表しますHusbandIdWifeId

私の問題では、w女性が同時に2人以上の男性と結婚できないという状態にあります「同期結婚」

そして私は次のクエリを持っています

SELECT
   DISTINCT A.WifeID
FROM
   Couple A
   INNER JOIN Couple B
      ON A.WifeID = B.WifeID
      AND A.HusbandID <> B.HusbandID
      AND A.StartDate < B.EndDate
      AND A.EndDate > B.StartDate;

これは、「同時に2人以上の男性と結婚した」同期結婚をしている女性を返します。

誰かがテーブルを挿入または更新したいときに起動するトリガーを書きたいのですが、couple このトリガーに障害情報がない場合にのみ変更を許可したいです(たとえば、誰かがカップルテーブルに行を挿入し、この行が#4の妻が同時に2人以上の人と結婚している場合、表の情報が間違っているため、この挿入を完了してはなりません)

この時点で誰かが私を助けることができますか?

4

1 に答える 1

2

これはトリガーなしで解決できます。Couples次のように、テーブル内のこれら 3 つのキーの複合主キーを作成します。

PRIMARY KEY(CoupleId, HusbandId, WifeId)

HusbandIdこれにより、とWifeIdfor eachの一意性が保証さ れますcoupleId

これら 2 つのテーブルのスキーマ設計のデモを次に示します。

SQL フィドルのデモ。


TRIGGER を使用してこれを行いたい場合は、次のようにしてください。

CREATE TRIGGER WhenInsertOrUpdate
ON Couples
INSTEAD OF INSERT, UPDATE
AS 
     IF (NOT EXISTS( SELECT c.CoupleId
                     FROM Couples c
                     INNER JOIN Inserted i  ON c.HusbandId = i.HusbandId
                                           AND c.WifeId = i.WifeId
                                           AND c.EndDate IS NULL))
    BEGIN
       INSERT INTO Couples
       SELECT  CoupleId, HusbandId, WifeId, StartDate, Enddate
       FROM Inserted
    END
    ELSE BEGIN
       --- You can put here an update..
    END

GO;

トリガーを使用して SQL Fiddle Demo を更新しました

これは単なる例です。必要に応じて、ELSEブロックに update ステートメントを指定する必要があります。

于 2013-01-01T09:18:49.070 に答える