【问题标题】:Error in creating foreign key in product table在产品表中创建外键时出错
【发布时间】:2017-07-04 02:53:12
【问题描述】:

我创建了一个表 Suppliers n 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)

但是当我尝试创建产品表时,它给出了一个错误

错误 1005 (HY000):无法创建表 'csm.products'(错误:150)

CSM 是一个数据库名称。

【问题讨论】:

  • 您应该引用 ID 而不是 NAME
  • @VishalRaut juergen d 的意思是引用供应商表的Supplier_ID 列而不是Supplier_Name 列。您不能拥有引用非主键列的引用键。

标签: mysql foreign-keys primary-key create-table


【解决方案1】:

试试这个:

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)

【讨论】:

  • 我可以将 Supplier_ID 和 Supplier_Name 都设为主键吗?这行得通吗?
  • 为什么同一张表有两个主键??
  • @VishalRaut 您不能在一张表上有两个主键。即使您创建由两列组成的复合主键,您也不能将其中之一作为参考键。我也不会解决这个问题。您可以拥有多个同名供应商,这将违背诚信的目的。
  • 一个供应商 ID 可以存在多个供应商名称吗?您可以创建索引。
【解决方案2】:

确保您引用 ID 而不是名称,如果您想将名称作为参考,请将供应商名称作为主要名称,并将 ID 作为唯一名称。虽然强烈推荐使用 ID 主键

【讨论】:

    【解决方案3】:

    正如@juergend 在评论中指出的那样,您应该在外键中引用Supplier_ID 字段,而不是Supplier_Name,还应该将Supplier_Name 替换为@987654325 中的Supplier_ID 字段@ 桌子。我还将供应商 ID 的数据类型更改为整数,可能是自动递增的。

    原因是

    1. 您可能有多个同名供应商
    2. 供应商可能会随时间更改名称
    3. 交叉检查固定长度的整数值和可变长度的长字符串效率更高。

    Si,我将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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 2017-02-04
      • 2013-08-20
      • 2021-01-28
      • 2014-03-06
      相关资源
      最近更新 更多