0

我有以下設置外鍵或鏈接

CREATE TABLE [dbo].[codevariable] (
    [id] [int] NULL, 
    [code] [nchar](10) NULL, 
    [variable] [int] NULL 
) ON [PRIMARY] 

CREATE TABLE [dbo].[proxy] (
    [id] [int] NULL, 
    [description] [nvarchar](50) NULL, 
    [status] [bit] NULL, 
    [added] [datetime] NULL 
) ON [PRIMARY] 


CREATE TABLE [dbo].[wall] (
    [id] [int] NULL, 
    [description] [nvarchar](50) NULL 
) ON [PRIMARY] 

表中以下值 表牆

1 This is a basic wall 
2 This is a medium wall 
3 This is an advanced wall 

表代理

1 Small Proxy True 2013-05-08 00:00:00.000 
2 Medium Proxy False 2013-05-08 00:00:00.000 
3個表

表CodeVariable

1 Proxy  1   
2 Proxy  2   
3 Wall  1   
4 Wall  2   
5 Wall  3  

Owke現在是我面臨的問題,如果我想插入讓我們說代理中的新行。然後它會有Id 3,現在我需要確保代碼3下的CodeVariable中也存在id 3!

如果沒有外鍵,就不會檢查代碼變量中是否存在代碼。

我試過用外鍵但沒有成功。我如何創建CodeVariable表的列代碼和變量表代理和表牆之間的鏈接。

我也可以創建索引代碼和變量是唯一的。但你無法將外鍵連接到它。我使用SQL 2008

感謝

+0

是的,你可以鏈接FK到複合獨特。但是你必須鏈接到整個密鑰。類型需要相同。爲什麼沃爾甚至在這個問題上? – Paparazzi 2013-05-08 19:24:17

+0

這是否意味着我必須在代理和牆表中添加其他列?這意味着嚎叫列將具有相同的值。 – 2013-05-08 19:35:02

回答

2

一種方式來改變表定義

,所以FOREIGN KEY約束可以強制執行。

使用用於表codevariable(更名爲code),其中codetype只能取2可能的值,要麼'P''W'複合主鍵(codeid, codetype)
(該code你已經可以用來代替所述codetype的不過我更窄的列密鑰(主鍵和外)的索引用於
code轉化爲計算列。):

CREATE TABLE [dbo].[code] (
    [codeid] [int] NOT NULL, 
    [codetype] [char](1) NOT NULL, 
    [codename] AS        -- computed column 
     CASE codetype WHEN 'P' THEN 'Proxy' 
         WHEN 'W' THEN 'Wall' 
     END, 
    CONSTRAINT code_PK 
     PRIMARY KEY (codeid, codetype), 
    CONSTRAINT codetype_CK 
     CHECK (codetype IN ('P', 'W')) 
) ; 

在其他兩個表,codetype加入爲好,這樣的(codeid, codetype)可以被定義爲既PRIMARYFOREIGN鍵:

CREATE TABLE [dbo].[proxy] (
    [proxyid] [int] NOT NULL, 
    [codetype] [char](1) NOT NULL DEFAULT 'P', 
    [description] [nvarchar](50) NULL, 
    [status] [bit] NULL, 
    [added] [datetime] NULL, 
    CONSTRAINT proxy_PK 
     PRIMARY KEY (proxyid, codetype), 
    CONSTRAINT code_proxy_FK 
     FOREIGN KEY (proxyid, codetype) 
     REFERENCES code (codeid, codetype), 
    CONSTRAINT codetype_proxy_CK 
     CHECK (codetype = 'P') 
) ; 


CREATE TABLE [dbo].[wall] (
    [wallid] [int] NOT NULL, 
    [codetype] [char](1) NOT NULL DEFAULT 'W', 
    [description] [nvarchar](50) NULL, 
    CONSTRAINT wall_PK 
     PRIMARY KEY (wallid, codetype), 
    CONSTRAINT code_wall_FK 
     FOREIGN KEY (wallid, codetype) 
     REFERENCES code (codeid, codetype), 
    CONSTRAINT codetype_wall_CK 
     CHECK (codetype = 'W') 
) ; 

SQL-Fiddle

+0

謝謝,這完成了這項工作:) – 2013-05-08 20:26:51