【问题标题】:Insert, Update Triggers插入、更新触发器
【发布时间】:2013-01-01 08:57:21
【问题描述】:

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

上表包含情侣信息,CoupleId是主键

HusbandIdWifeId 是另一个名为 Person 的表的外键

StartDateEndDate 表示男性与HusbandId 和女性与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 的妻子同时与拖车或更多人结婚,这插入不能完成,因为它会在表格中生成错误的信息)

此时有人可以帮助我吗?

【问题讨论】:

    标签: sql sql-server triggers sql-server-2012


    【解决方案1】:

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

    PRIMARY KEY(CoupleId, HusbandId, WifeId)
    

    这将确保每个coupleIdHusbandIdWifeId 的唯一性。

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

    SQL Fiddle Demo.


    如果您想使用 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;
    

    Updated SQL Fiddle Demo using a trigger.

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

    【讨论】:

    • 不应该以某种方式考虑 startDate 和 endDate 吗?一对夫妇可以离婚并结婚不止一次。
    • @a_horse_with_no_name - 是的,我注意到了。 OP 没有提到这个表应该如何处理这个问题。我认为在这种情况下最好将它移到一个新表中。以及如何将一个新列Status 作为已离婚或已婚添加到复合键中?但他的婚姻和离婚不会超过一次。
    • @MahmoudGamal 谢谢,但我想通过触发器来完成,因为它是 HomeWork 中的一个请求 :) ...我搜索了很多关于触发器的信息,但我没有找到任何有用的教程 :(
    • @MGCR7 好的,我会更新我的答案。但是 startdate 和 enddate 呢?如果 enddate 为空,那么这对夫妇仍然结婚,如果这不为空,那么他们结婚了吗?
    • @MahmoudGamal 你说得对,我想这两个日期不为空,但如果我讨论结束日期为空的状态,那么这对夫妇仍然结婚,如果它不为空,那么这对夫妇是未婚
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多