gpt4 book ai didi

数据库约束

转载 作者:搜寻专家 更新时间:2023-10-30 20:27:07 26 4
gpt4 key购买 nike

我有一个包含三个表的数据库:TEAMPLAYERCONTRACT

TEAM(teamID, name)
PLAYER(playerID, name)
CONTRACT(contractID, playerID, teamID, dateOfSigning, expirationDate)

在这个数据库中,我想要一个球员不能同时拥有多个契约(Contract)的约束。 我提到我希望过期契约(Contract)保留在我的数据库中。

例如:

CONTRACT(1,1,1, 01/01/2000, 01/01/2005)
CONTRACT(1,1,1, 01/01/2001, 01/01/2003)

所以,我的球员有一份从 01/01/2000 到 01/01/2005 的契约(Contract)和另一份从 01/01/2001 到 01/01/2003 的契约(Contract)。 这是不可能的。

最佳答案

一个球员的两份不同契约(Contract)不会重叠,当且仅当一个契约(Contract)在另一个契约(Contract)结束后开始。因此,当且仅当 NOT(一个在另一个完成后开始)时,它们才会重叠。你想要的约束是没有一行 contractID 对满足它们重叠的条件:

    CONTRACT(c1.contractID, playerID, c1.teamID, c1.dateOfSigning, c1.expirationDate)
AND CONTRACT(c2.contractID, playerID, c2.teamID, c2.dateOfSigning, c2.expirationDate)
AND c1.contractID <> c2.contractID
AND NOT(c1.dateOfSigning > c2.expirationDate
OR c2.dateOfSigning > c1.expirationDate)

这意味着下面的一组行是空的:

SELECT c1.contractID, c2.contractID
FROM CONTRACT c1
JOIN CONTRACT c2
ON c1.playerID = c2.playerID
AND c1.contractID <> c2.contractID
WHERE NOT(c1.dateOfSigning > c2.expirationDate
OR c2.dateOfSigning > c1.expirationDate)

如果 DBMS 在 CHECK 中支持 SELECT,那么您可以有一个 CONTRACT 约束:

CHECK (SELECT CASE
WHEN EXISTS (SELECT 1 FROM (...))
THEN 1
ELSE 0 END)

但它们没有,因此您必须在触发器或存储过程中测试此 SELECT。 (如另一个答案中所述。)DBMS 不支持任意约束检查。

您可以通过将过期合约与有效合约保存在不同的表中来减少计算量。 (它们不会与新的重叠。)但我刚刚使用了您提供的表格。

关于数据库约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27464828/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com