0

我想在同一张表中的列(程序代码和测试代码)之间建立一对一的关系。我希望所有具有相同测试代码的测试都具有相同的程序代码。

  1. 我的第一个想法是使用 UDF 来查找相同测试代码对应于两个不同程序的情况。我了解到这将不起作用,因为 t-sql 仅在之后检查 UDF 的检查约束INSERTS——而不是在UPDATES 为什么 t-sql 允许我违反使用 UDP 的检查约束之后?

  2. 我的下一个想法是将逻辑从 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 和虚拟表。这看起来真的很难看,所以必须有更好的方法。对?

4

1 回答 1

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
于 2013-03-27T20:16:49.567 回答