我想在相同表中的两个列(程序代码和测试代码)之间建立一对一的关系。我希望所有具有相同测试代码的测试都具有相同的程序代码。
我的第一个想法是使用UDF查找相同测试代码对应两个不同程序的情况。我了解到这不起作用,因为t-sql仅在INSERTS
之后检查检查约束中的UDF,而不是UPDATES
之后
why is t-sql allowing me to violate a check constraint that uses a UDP?
我的下一个想法是将逻辑从UDF移动到检查约束本身。但是t-sql说在检查约束中不允许子查询。这也意味着我不能使用EXISTS
语法(我认为它也使用了子查询)。
ALTER TABLE [dbo].[mytable] WITH CHECK ADD CONSTRAINT [oneProgramPerTest] CHECK
(
(select COUNT(*)
from mydb.dbo.mytable u1
inner join
mydb.dbo.mytable u2 on u1.testcode=u2.testcode and u1.progcode <> u2.progcode
)=0
)
除非有某种方法在没有(1)udf或(2)子查询的情况下强制执行此逻辑,否则我似乎需要创建程序代码的“虚拟”表,然后强制执行一对一的关系来自myTable和虚拟表的测试代码之间。这似乎真的丑陋,所以必须有一个更好的方法。正确?
答案 0 :(得分:2)
您是否了解了规范化(如果您没有为什么要设计数据库?)。你应该有
的结构tableA
id (PK)
programcode
other fields
tableB
programcode (PK)
testcode
在两个表之间添加正式的外键,并将程序代码定义为tableb中的PK。 然后获取您想要的数据:
select <Name specific fields, never use select *>
from tableA a
join tableB b on a.programcode = b.programcode