我正試圖跨多個表創建一個唯一的約束。我在這裏找到了類似的問題,但他們並沒有完全理解我想要做的事情。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)
)
我的目標是讓AppName的和ITEMNAME在所有3個表是唯一的。例如,應用程序X中的Y的項目名稱不能同時存在於模擬表和離散表中。
請注意,這個例子是人爲設計的,每個類型的實際數據是不同的,並且足夠大以使得組合表格和添加類型列非常難看。
如果您對此方法有任何建議,我很樂意聽到他們!
---- BEGIN編輯2012-04-26 13:28 CST ----
謝謝大家對你的答案!
看來有可能是因爲修改這個數據庫的模式,這很好。
將這些表合併成一個表並不是一個真正可行的選擇,因爲每種類型的不匹配都有30列的順序(修改這些列不幸是不可選的)。這可能會導致大部分列不在每行中使用,這似乎是一個壞主意。
添加第4張表,如John Sikora和其他人提到的,可能是一個選項,但我想先驗證一下。
修改架構是:
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'和具有'itemId'爲9且'值'爲9.3並且同時t_Message具有'itemId'9的表t_Analog的項目「富」的「價值」?
我可能不完全理解這種額外的表格方法,但我不反對它。
如果我對此有錯,請糾正我。
你在正確的軌道上,但完整性約束不夠好。例如,ID號100可能出現在每個表中。爲了更緊密地使用該項目類型,請參閱[此答案](http://stackoverflow.com/a/10077883/562459)和[此答案](http://stackoverflow.com/a/5471265/562459)。 – 2012-04-27 01:24:40