2015-02-09 62 views
0

我有以下T-SQL在VS2013:不會指定一個外鍵約束讓我陷入麻煩?

CREATE TABLE [dbo].[Jugo] 
(
    [JugoID] INT   IDENTITY (1, 1) NOT NULL, 
    [Jugo] NVARCHAR (50) NOT NULL, 
    [ColorID] INT   NOT NULL, 
    [IngreID] INT   NOT NULL, 

    PRIMARY KEY CLUSTERED ([JugoID] ASC), 
    FOREIGN KEY (ColorID) REFERENCES Color (ColorID) 
     ON UPDATE CASCADE ON DELETE CASCADE, 
    FOREIGN KEY (IngreID) REFERENCES Ingrediente (IngreID) 
     ON UPDATE CASCADE ON DELETE CASCADE 
); 

我更新資料庫之前得到以下信息:

亮點

用戶動作 創建 外鍵:[dbo]上的未命名約束[Jugo](外鍵) 外鍵:[dbo上的未命名約束] [Jugo](外鍵)

支持行動

我可以繼續執行這些不願透露姓名的限制?我需要什麼約束?

供參考,這是我想要做的事:

3個表:

JugoColorIngrediente:所以創建指定名稱,顏色和成分的jugo(汁),色和成分在他們自己的表上,因此我想定義的外鍵。

謝謝。

+0

您可以繼續 - SQL Server只會給這些外鍵約束賦予系統定義的名稱。它們仍然可以工作,所有 - 如果您需要放棄/禁用FK約束,它會變得更加困難,因爲約束的**名稱**由SQL Server未知/隨機創建。 – 2015-02-09 06:11:30

+1

有一個很好的答案,爲什麼你應該指定foreighn鍵約束:http://dba.stackexchange.com/questions/15388/where-should-you-define-foreign-keys – 2015-02-09 06:22:00

回答

0

只要ColorIDIngreID都是他們自己表中的主鍵,就不會有任何問題。

但這裏有一個問題,你沒有限制你的主鍵。對於您正在使用的每個PRIMARY KEY,使用約束是一種很好的做法,這樣,當您將外鍵指定給另一個表時。它可以讀取它來自另一個表。我不知道在VS2013 SQL但這裏是我的SQL Server示例:

CREATE TABLE JUGO 
(
    JUGOID numeric identity (1,1) //For auto increment 
     CONSTRAINT PK_JUGOID PRIMARY KEY (JUGOID), 
    JUGO nvarchar(50) not null, 
    . 
    . 
    . 
) 

CONSTRAINT PK_JUGOID PRIMARY KEY (JUGOID),PK_JUGOID是用戶定義的,但它是一個很好的做法,只是主鍵的格式副本,以便您在使用外鍵時不會感到困惑。 :)

+0

你真正的意思是OP沒有給主鍵約束一個**用戶指定的名稱** - 它將被分配一個系統定義的名稱。 – 2015-02-09 06:08:20

+0

是的。但是,僅僅依靠系統定義並不是一個好習慣,如果你在大型數據庫中工作,你會感到困惑。 – Kuroro 2015-02-09 06:36:39

+0

謝謝大家。 – 2015-02-09 18:20:07

0

外鍵用於數據一致性。您在列上創建外鍵,以避免無效條目。

FOREIGN KEY (ColorID) REFERENCES Color (ColorID) 
    ON UPDATE CASCADE ON DELETE CASCADE, 

此限制可確保您的jugo只能具有顏色表中存在的顏色。此外,您有兩個級聯的命令:

  • ON UPDATE CASCADE意味着如果紅色是ID 5,但你想將其更改爲500,變化將自動爲所有jugo記錄執行。但是,ID不應該改變,所以這是一個很少使用的條款。
  • ON DELETE CASCADE意味着如果您刪除紅色,那麼您將刪除所有紅色的jugo記錄。我不知道這是否適合你。它用於例如用戶表上。刪除用戶,以便刪除其完整數據。但刪除一個顏色?

最後你應該給你的約束名稱,所以你更容易處理它們。

CONSTRAINT pk_jugo PRIMARY KEY CLUSTERED ([JugoID] ASC), 
CONSTRAINT fk_jugo_color FOREIGN KEY (ColorID) REFERENCES Color (ColorID), 
CONSTRAINT fk_jugo_ingre FOREIGN KEY (IngreID) REFERENCES Ingrediente (IngreID)