繁体   English   中英

SQL Server外键

[英]SQL Server Foreign Key

我正在尝试使用SQL Server中的以下关系创建此数据库,但出现此错误:

消息1776,级别16,状态0,第11行
在引用的表“ Consumable”中没有与外键“ FK_ Recipe _Ingredie__59FA5E80”中的引用列列表匹配的主键或候选键。
消息1750,级别16,状态0,第11行
无法创建约束。 请参阅先前的错误。

我究竟做错了什么?

这是我的代码;

CREATE TABLE Consumable
(
    c_ID int NOT NULL,
    Name varchar(32) NOT NULL,
    Amount int,
    Unit varchar(8) NOT NULL CHECK (unit IN ('ml', 'g', 'pieces', 'unknown')),
    CONSTRAINT PK_Consumable PRIMARY KEY (c_ID, Name)
)

CREATE TABLE Recipe
(
    Name varchar(64) PRIMARY KEY NOT NULL,
    Type varchar(32),
    Description varchar(512),
    IngredientsID int NOT NULL FOREIGN KEY REFERENCES Consumable(c_ID) ON DELETE CASCADE
)

CREATE TABLE Kitchen
(
    K_ID int PRIMARY KEY NOT NULL IDENTITY,
    IngredientsID int FOREIGN KEY REFERENCES Consumable(c_ID) ON DELETE CASCADE
)

阅读错误消息!

很明显:您试图从Recipe.IngredientsID设置的外键没有引用目标表的主键Consumable -主键是(c_ID, Name) -不仅是c_ID ....)

要解决此问题:您必须在目标表上引用整个复合PK(例如,您的子表中必须同时具有PK_Consumable 两列才能对其进行引用

CREATE TABLE Recipe
(
    Name varchar(64) PRIMARY KEY NOT NULL,
    Type varchar(32),
    Description varchar(512),
    IngredientsID int NOT NULL,
    IngredientsName varchar(32) NOT NULL,

    CONSTRAINT FK_Recipe_Consumable 
    FOREIGN KEY (IngredientsID, IngredientsName) 
    REFERENCES Consumable(c_ID, Name) ON DELETE CASCADE
)

任何外键只能引用父表的WHOLE主键 -或唯一约束(再次:该唯一约束所涉及的所有列)。 您不能只是简单地在父表中引用任意列(或一组列)。

您的Pk是复合PK,因此c_id不一定是唯一的,因此不能在FK关系中使用。

您可以根据自己的选择进行选择。 如果在消耗品表中没有多个c_id,则可以在其上创建唯一索引,并且应该能够创建Fk。 在那种情况下,真的为什么要使用Compositer OK? 在这种情况下,您还有另一种选择,就是只将c_id用作PK,然后在Name上放置一个唯一索引。 不必使用复合PK。

如果C_id在“消耗品”表中将是唯一的,那么您唯一的选择是将“名称”列添加到“其他”表中。 您当然必须在配方中给它一个不同的名称,因为它具有不同的名称。

在配方表中,Ingredients_id没有意义,因为您将在一个配方中包含多个成分。 您应该有一个包含配方成分的子表。

而且“删除级联”也是一个糟糕的选择。 对一个不错的无辜数据库来说,这很不好。 您是否真的要删除没有配料的食谱? 我不这么认为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM