相关疑难解决方法(0)

跨多个表的SQL唯一约束

我试图在多个表中创建一个唯一约束.我在这里找到了类似的问题,但是他们并没有完全捕捉到我想要做的精神.

作为一个例子,我有三个表,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)
)
Run Code Online (Sandbox Code Playgroud)

我的目标是在所有3个表中使AppName和ItemName唯一.例如,应用程序X中的项目名称Y不能同时存在于模拟和离散表中.

请注意,这个例子是设计的,每个Type的实际数据是不同的,大到足以组合表并添加一个非常难看的Type列.

如果您对此方法有任何建议,我很乐意听到他们的意见!

----开始编辑2012-04-26 13:28 CST ----

谢谢大家的答案!

似乎可能有理由修改此数据库的架构,这很好.

将表组合到单个表中实际上并不是一个可行的选项,因为每个类型的列数量不超过30个(不幸的是,修改这些列不是一个选项).这可能导致每行中没有使用大部分列,这似乎是一个坏主意.

添加第4个表,如John Sikora和其他人提到的,可能是一个选项,但我想首先验证这一点.

修改架构为:

CREATE TABLE t_AllItems(
    [id] [bigint] …
Run Code Online (Sandbox Code Playgroud)

sql-server database-design unique-constraint

22
推荐指数
2
解决办法
3万
查看次数