[英]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.