我正在尝试跨多个表创建唯一约束。我发现在这里回答了类似的问题,但它们并没有完全抓住我想要做的事情的精神。
例如,我有三个表,t_Analog、t_Discrete、t_Message
CREATE TABLE t_Analog(
[AppName] [nvarchar](20) NOT NULL,
[ItemName] [nvarchar](32) NOT NULL,
[Value] [float] NOT NULL,
CONSTRAINT [uc_t_Analog] UNIQUE(AppName, ItemName)
)
CREATE TABLE t_Discrete(
[AppName] [nvarchar](20) NOT NULL,
[ItemName] [nvarchar](32) NOT NULL,
[Value] [bit] NOT NULL,
CONSTRAINT [uc_t_Discrete] UNIQUE(AppName, ItemName)
)
CREATE TABLE t_Message(
[AppName] [nvarchar](20) NOT NULL,
[ItemName] [nvarchar](32) NOT NULL,
[Value] [nvarchar](256) NOT NULL,
CONSTRAINT [uc_t_Message] UNIQUE(AppName, ItemName)
)
我的目标是使 AppName 和 ItemName 在所有 3 个表中都是唯一的。例如,应用程序 X 中的项目名称 Y 不能同时存在于模拟表和离散表中。
请注意,此示例是人为设计的,每种类型的实际数据都不同且大到足以使组合表和添加类型列变得非常难看。
如果您对此方法有任何建议,我很想听听他们的意见!
---- 开始编辑 2012-04-26 13:28 CST ----
谢谢大家的答案!
似乎有可能修改此数据库的架构,这很好。
将这些表组合成一个表并不是一个真正可行的选择,因为每种类型的不匹配的列大约为 30 列(不幸的是,修改这些列不是一个选项)。这可能导致每一行中没有使用大部分列,这似乎是个坏主意。
添加第四张桌子,如 John Sikora 和其他人提到的,可能是一种选择,但我想先验证一下。
将 Schema 修改为:
CREATE TABLE t_AllItems(
[id] [bigint] IDENTITY(1,1) NOT NULL,
[itemType] [int] NOT NULL,
[AppName] [nvarchar](20) NOT NULL,
[ItemName] [nvarchar](32) NOT NULL,
CONSTRAINT [pk_t_AllItems] PRIMARY KEY CLUSTERED ( [id] )
CONSTRAINT [uc_t_AllItems] UNIQUE([id], [AppName], [ItemName])
) ON [PRIMARY]
CREATE TABLE t_Analog(
[itemId] [bigint] NOT NULL,
[Value] [float] NOT NULL,
FOREIGN KEY (itemId) REFERENCES t_AllItems(id)
)
CREATE TABLE t_Discrete(
[itemId] [bigint] NOT NULL,
[Value] [bit] NOT NULL,
FOREIGN KEY (itemId) REFERENCES t_AllItems(id)
)
CREATE TABLE t_Message(
[itemId] [bigint] NOT NULL,
[Value] [nvarchar](256) NOT NULL,
FOREIGN KEY (itemId) REFERENCES t_AllItems(id)
)
关于这种方法,我只有一个问题。这是否强制跨子表的唯一性?
例如,是否不存在具有 'id' 9 的 'Item' 表 t_Analog 的 'itemId' 为 9 和 'value' 为 9.3,同时 t_Message 的 'itemId' 为 9 和 'Value' “富”?
我可能不完全理解这种额外的表格方法,但我并不反对它。
如果我对此有误,请纠正我。