小编Cor*_*ryC的帖子

跨多个表的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万
查看次数

在Ubuntu上编译AIX的C++代码?

一句话的问题:如何在Ubuntu上使用G ++编译AIX代码?(假设有可能)

我希望它就像在make文件中添加一个选项来指定目标处理器一样简单.对于编译器相关的大多数事情我都是新手.

先感谢您.

c++ linux aix g++

6
推荐指数
1
解决办法
3732
查看次数

标签 统计

aix ×1

c++ ×1

database-design ×1

g++ ×1

linux ×1

sql-server ×1

unique-constraint ×1