2015-02-09 60 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)