【发布时间】:2015-07-24 11:39:33
【问题描述】:
我有一张表格,用于推送相关数据。它有 6 个可以为空的列。根据一些逻辑,2 的组合总是非空的(第一个 + 最后 4 个中的一个和第二个 + 最后 4 个中的一个)。这样我就避免了使用 8 个不同的表来保存数据。
是否有任何 T-SQL (开始对 SQL Server 细节相当陌生) 快捷方式来在这 6 列上创建唯一键,以确保索引中提到的列之间的任何非空组合(1st - 6th) 是独一无二的,而没有真正具体的开始?
我可以为每个组合创建唯一索引,但我想知道是否有任何捷径可以保持懒惰并使用 (write) 1 个索引与其中 8 个索引。这显然不是一个很大的努力,但任何更短的东西都会更好......在代码中,大多数时候!
【问题讨论】:
-
拥有空列只是为了避免创建正确的表是一个糟糕的设计,其中一个后果是您需要添加检查和约束以避免错误的值。而是创建一个适当的设计。如果您想一次从所有表中读取数据,请使用带有联合的视图
-
@PanagiotisKanavos 我知道这是糟糕的设计,但是 8 个表让 SqlServer 的生活更轻松,而 1 个表让我的生活更轻松。鉴于该表 99% 是只读的,而且不经常访问……对我来说更轻松的生活是当务之急。 ;)
-
那你为什么会遇到麻烦?实际上,它们使服务器和程序员的事情都更糟。 SQL Server 有一些高级功能可以克服这些缺点,但最终你必须修复设计
-
@PanagiotisKanavos 不得不进行一些更改并更新 8 个表......并不是那么有趣。所以我把它们结合起来。我最初构建了 8 ......但是更新 8 并不好玩。尤其是 DB + Code 方面。 :)
-
根据您的描述,您似乎只需要 两个 表,每个表有 4 个可空列。第一/第二列不能为空,它们只会分别出现在第一、第二表中。如果你解释了你想要做什么,你可以进一步简化它。例如,如果您使用可为空的列来强制从标志或位域中选择单个值,则可以使用查找表并仅创建单个查找列
标签: sql-server tsql