2013-01-01 173 views
1

我有一个表称为Couple它具有以下字段CoupleId, HusbandId , WifeId , StartDate , EndDate插入,更新触发器

上表中包含关于夫妇的信息,该CoupleId是一个主键

HusbandIdWifeId外键的形成另一个表命名为Person

StartDateEndDate代表发生在男性与HusbandId之间的婚姻的开始/结束日期和fe男性与我的问题WifeId

我有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的妻子与两个人同时结婚,此插入一定不能完成,因为它在表格中产生了错误的信息)

任何人都可以在这一点帮助我吗?

回答

2

你可以在没有触发器的情况下解决这个问题。请在Couples表这三个键的复合主键,像这样:

PRIMARY KEY(CoupleId, HusbandId, WifeId) 

这将确保该HusbandIdWifeId每个coupleId的唯一性。

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

SQL Fiddle Demo.


如果你想这样做,使用触发器,试试这个:

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; 

Updated SQL Fiddle Demo using a trigger

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

+0

不应该以某种方式考虑startDate和endDate吗?一对夫妇可能会离婚并结婚不止一次。 –

+0

@a_horse_with_no_name - 是的,我注意到了。 OP没有提到这张桌子应该如何处理这个问题。我认为最好在这种情况下将其转移到新表中。那么如何将离婚或结婚的新“列表”状态添加到组合键中?但他的婚姻和离婚不会合作一次以上。 –

+0

@MahmoudGamal谢谢,但我想通过触发器来完成它,因为这是HomeWork中的一个请求:) ...我搜索了很多关于触发器,但我没有找到任何有用的教程:( –