我有一个名为Couple
的表格,其中包含以下字段CoupleId, HusbandId , WifeId ,
StartDate , EndDate
上一个表包含有关couple的信息,CoupleId
是主键
HusbandId
和WifeId
是外键,另一个表名为Person
StartDate
和EndDate
代表男性HusbandId
与女性WifeId
在我的问题中我有一个条件,即女性不能同时嫁给两个或两个以上的男性“同步婚姻”
我有以下查询
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与两个人同时结婚,这个插入不得完成,因为它在表中输入错误信息
此时有人可以帮助我吗?
答案 0 :(得分:2)
您可以在没有触发器的情况下解决此问题。在Couples
表中创建这三个键的复合主键,如下所示:
PRIMARY KEY(CoupleId, HusbandId, WifeId)
这将确保每个HusbandId
的{{1}}和WifeId
的唯一性。
以下是这两个表的架构设计演示:
如果您想使用TRIGGER执行此操作,请尝试以下操作:
coupleId
Updated SQL Fiddle Demo using a 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;
块中提供更新声明。