Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 主/细节防止细节组合_Sql_Sql Server_Database Design - Fatal编程技术网

Sql 主/细节防止细节组合

Sql 主/细节防止细节组合,sql,sql-server,database-design,Sql,Sql Server,Database Design,假设您有一个主表,其中包含一些数据 MasterId MasterData -------- ---------- 1 data1 2 data2 3 data3 以及引用主控形状的明细表 DetailId DetailMasterId DetailKind DetailData -------- -------------- ---------- ---------- 1

假设您有一个主表,其中包含一些数据

MasterId    MasterData
--------    ----------
1           data1
2           data2
3           data3
以及引用主控形状的明细表

DetailId    DetailMasterId     DetailKind    DetailData
--------    --------------     ----------    ----------
1           1                  A             detailData1
2           1                  B             detailData2
3           2                  C             detailData3
4           1                  C             detailData4

有没有办法根据SQL Server的能力定义一些无效的组合?假设您不希望将detailKind a和C的Detail组合允许到同一主控形状

如果您不想使用触发器,您可以尝试克服
检查
约束的限制:

CREATE FUNCTION ExistsDetailKind(
    @MasterID INT, @DetailKind VARCHAR(10)
)
RETURNS bit
AS
BEGIN

    IF EXISTS (-- <Put your logic here>)
        return 1
    return 0
END

ALTER TABLE detail 
WITH CHECK ADD CONSTRAINT CK_DetailTypes 
CHECK (ExistsDetailKind(DetailMasterId, DetailKind) = 0)
创建函数existsdeailkind(
@MasterID INT,@DetailKind VARCHAR(10)
)
返回位
作为
开始
如果存在(--)
返回1
返回0
结束
更改表格细节
使用复选框添加约束CK\u DetailTypes
检查(ExistsDetailKind(DetailMasterId,DetailKind)=0)

不清楚您想要什么:查询哪个返回无效的组合ID,或者某种防止db中出现无效组合的构造?如果您提供了输入和所需的解决方案,这将有所帮助。例如,(A,C)是输入,对于给定的数据应该或不应该发生什么?@Rimes我不需要查询来获取无效的组合,我想防止这种组合。(触发器旁边)@Bulat如果已经有a-Detail,则不能插入C-Detail,并且允许您使用触发器吗?