【问题标题】:Will not specifying a foreign key constraint get me in trouble?不指定外键约束会给我带来麻烦吗?
【发布时间】:2015-04-08 19:28:04
【问题描述】:

我在VS2013中有如下T-SQL:

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(果汁),你可以指定名称、颜色和成分,颜色和成分在它们自己的表上,因此我想定义外键。

谢谢。

【问题讨论】:

  • 您可以继续 - SQL Server 只会为这些外键约束提供系统定义的名称。它们仍然可以正常工作 - 如果您需要删除/禁用 FK 约束,那就更难了,因为约束的 name 是未知的/由 SQL Server 随机创建。跨度>
  • 有一个很好的答案为什么你应该指定外键约束:dba.stackexchange.com/questions/15388/…

标签: sql sql-server foreign-keys


【解决方案1】:

只要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 是用户定义的,但最好只复制主键的格式,这样在使用外键时就不会感到困惑。 :)

【讨论】:

  • 你真正的意思是OP没有给主键约束一个用户指定的名称 - 它将被分配一个系统定义的。
  • 是的。但是仅仅依赖于系统定义并不是一个好习惯,如果您在大型数据库中工作,您会感到困惑。
【解决方案2】:

外键用于数据一致性。您在列上创建外键,以免出现无效条目。

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

此约束确保您的 jugo 只能具有颜色表中存在的颜色。此外,您还有两个级联命令:

  • ON UPDATE CASCADE 表示如果红色的 ID 为 5,但您想将其更改为 500,则会对所有 jugo 记录自动执行更改。但是,ID 永远不应该改变,所以这是一个很少使用的子句。
  • ON DELETE CASCADE 意味着如果你删除了red,那么你就删除了所有的red 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2017-10-27
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多