gpt4 book ai didi

sql-server - 与条件的外键关系

转载 作者:行者123 更新时间:2023-12-01 05:04:47 25 4
gpt4 key购买 nike

早上好,
我有一个带有 ID 和类型的主表。根据类型,我有使用此 ID 作为外键的子表以确保完整性。
例如。对于主表:

master_ID, type
11, A
12, B
13, A
对于名为 Child_A 的子表,它存储类型 A 的附加数据;
Child_A_ID, FK_master_ID, ....
1, 11, ....
2, 13, ....
当我的子表中有相应的记录时,如何防止我的主表中的类型更改为不同的值。我的参照完整性目前是保留的,但是在A类型的Child_A中存储信息是没有意义的,而主表中的记录是不同类型的。
编辑:
拥有具有 2 个属性(ID 和类型)的外键并在每个子表中重复该类型是唯一的解决方案吗?
例如。对于 child_A 表;
Child_A_ID, FK_master_ID, type, ....
1, 11, A, ....
2, 13, A, ....
希望它足够清楚。

最佳答案

您可以创建一个 check constraint使用 user defined function确定 id 值是否包含在相关类型表中。

ALTER TABLE MasterTable
ADD CONSTRAINT CHK_MasterTable_Type
CHECK(dbo.fn_check_IdBelongsToType(master_ID, type) = 1)

在函数本身中,您可以执行以下操作:
CREATE FUNCTION fn_check_IdBelongsToType (
@master_ID int,
@type char(1)
)
RETURNS int
AS
BEGIN
IF @Type = 'A' AND EXISTS (
SELECT 1
FROM Child_A
WHERE FK_master_ID = @master_ID
) RETURN 1

IF @Type = 'B' AND EXISTS (
SELECT 1
FROM Child_B
WHERE FK_master_ID = @master_ID
) RETURN 1

IF @Type = 'C' AND EXISTS (
SELECT 1
FROM Child_C
WHERE FK_master_ID = @master_ID
) RETURN 1

-- after testing all child tables, return 0 to indicate that the value was not found
RETURN 0

END

关于sql-server - 与条件的外键关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30022522/

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