1

我有一个名为的表Couple,其中包含以下字段CoupleId, HusbandId , WifeId , StartDate , EndDate

上一个表包含有关情侣的信息,这CoupleId是一个主键

HusbandId并且WifeId是外键形成另一个名为的表Person

StartDate并表示男性与女性EndDate之间发生的婚姻的开始/结束日期HusbandIdWifeId

在我的问题中,我有一个条件是 w 女性不能同时与两个或更多男性结婚“同步婚姻”

我有以下查询

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;

这将返回任何具有同步婚姻的女性“同时与两个或更多男性结婚”

我想编写当有人想要插入或更新couple 表时触发的触发器,并且我希望这个触发器只有在它没有提供错误信息时才允许修改(例如,如果有人在一对表上插入一行并且这一行使#4 的妻子同时与两个或更多人结婚,此插入不能完成,因为它会在表格中显示错误信息)

此时有人可以帮助我吗?

4

1 回答 1

2

您可以在没有触发器的情况下解决此问题。在表中创建这三个键的复合主键,如下Couples所示:

PRIMARY KEY(CoupleId, HusbandId, WifeId)

这将确保 和 的 HusbandId唯一WifeIdcoupleId

这是这两个表的架构设计演示:

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 演示

这只是一个示例,ELSE如果需要,您必须在块中提供更新语句。

于 2013-01-01T09:18:49.070 回答