2017-02-15 44 views
1

我创建了一个表供应商ňMySQL的
供应商描述:我要创建表产品 产品说明会出错创建产品表的外键

Supplier_ID varchar(5) NOT NULL 
Supplier_Name varchar(30) 
Supplier_Address varchar(50) 
Supplier_Contact int(12) 
Supplier_Email varchar(30) 
PRIMARY KEY(Supplier_ID) 

现在, :

Product_ID varchar(5) NOT NULL 
Product_Name varchar(30) 
Supp_Name varchar(30) 
Product_Category varchar(20) 
Unit_Price int(11) 
Unit_In_Stock int(11) 
PRIMARY KEY(Product_ID) 
FOREIGN KEY(Supp_Name) REFERENCES Suppliers(Supplier_Name) 

但是,当我试图创建产品表时,它的givin克错误

ERROR 1005 (HY000): Can't create table 'csm.products' (error:150)

CSM是一个数据库的名称。

+1

您应该引用ID,而不是名称 –

+0

@VishalRaut什么'于尔根·D'意思是引用供应商表中的'Supplier_ID'列而不是'Supplier_Name'列。您不能使用引用键来引用不是主键的列。 –

回答

0

试试这个:

Product_ID varchar(5) NOT NULL, 
Product_Name varchar(30), 
Supplier_ID varchar(5) NOT NULL, 
Product_Category varchar(20), 
Unit_Price int(11), 
Unit_In_Stock int(11), 
PRIMARY KEY(Product_ID), 
FOREIGN KEY(Supplier_ID) REFERENCES Suppliers(Supplier_iD) 
+0

我可以使Supplier_ID和Supplier_Name都是主键。这会工作吗? –

+0

为什么你会在同一张桌子上有2个主键? – user7417866

+1

@VishalRaut在一个表上不能有两个主键。即使您创建由两列组成的复合主键,也不能将其中的一个作为参考键。我也不会解决这个问题。您可以拥有多个具有相同名称的供应商,这样就会失去诚信的目的。 –

0

确保您引用编号没有名字,如果你想拥有的名字作为参考化妆供应商名称为小学和id作为唯一的。虽然有ID主键是高度recomended

1

由于@juergend也在评论中指出,你应该引用Supplier_ID场在你的外键,而不是Supplier_Name,也应更换Supplier_NameSupplier_ID场在products表。我还会将供应商ID的数据类型更改为一个整数,可能是一个自动递增的整数。

的原因是

  1. 您可能具有相同名称的多个供应商
  2. 供应商可能在时间
  3. 这是很多更有效的跨越检查固定长度的整数值更改名称一个长的,可变长度的字符串。

硅,我会改变products表如下:

Product_ID varchar(5) NOT NULL, 
Product_Name varchar(30), 
Supplier_ID int NOT NULL, 
Product_Category varchar(20), 
Unit_Price int(11), 
Unit_In_Stock int(11), 
PRIMARY KEY(Product_ID), 
FOREIGN KEY(Supplier_ID) REFERENCES Suppliers(Supplier_iD) 

supplier表:

Supplier_ID int NOT NULL [auto_increment] 
Supplier_Name varchar(30) 
Supplier_Address varchar(50) 
Supplier_Contact int(12) 
Supplier_Email varchar(30) 
PRIMARY KEY(Supplier_ID)