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,并且允许您使用触发器吗?