MYSQL:外键错误

时间:2012-11-28 20:51:33

标签: mysql

添加一个时出现一些外键错误。我有:

CREATE TABLE PRODUCT_1( PROD_ID NUMERIC(5) NOT NULL PRIMARY KEY,
  PROD_NAME CHAR(20), 
  PROD_DESC CHAR(20),  
  PROD_PRICE NUMERIC(20), 
  SIZE_ID NUMERIC(5) NOT NULL, 
  PROD_CAT_ID CHAR(5));


CREATE TABLE SIZE( 
  SIZE_ID NUMERIC(5) NOT NULL PRIMARY KEY, 
  SIZE_SMALL CHAR(2), 
  SIZE_MEDIUM CHAR(2), 
  SIZE_LARGE CHAR(2));

我正在尝试使用以下方法添加外键:

alter table SIZE 添加外键(SIZE_ID)引用PRODUCT_1(SIZE_ID)

但我收到以下错误: ERROR 1005(HY000):无法创建表'。/ mmmm / #sql-842_33e1.frm'(错误号:150)

然而,如果我走另一条路:

更改表格PRODUCT_1 添加外键(SIZE_ID)引用SIZE(SIZE_ID)

这工作正常,我无法向它添加任何数据,它给我一个错误,如“无法更新子表”。

任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

这是正确的。 SIZE_ID是PRODUCT_1中的“外键”,因为它是SIZE表的“主键”。尝试向SIZE添加外键约束没有任何意义。

如果您运行SHOW INNODB STATUS,您将获得一些信息,表明您没有所需的索引,但是,从逻辑上讲,没有理由尝试创建该约束。

但您确实想在PRODUCT_1上创建约束。此时,您只能在PRODUCT_1中输入已存在于SIZE中的SIZE_ID值,因为这是典型的“查找表”设计。

答案 1 :(得分:1)

PRODUCT_1.SIZE_ID在此示例中是外键,因为它引用了另一个表SIZE的主键。 因此,第二个ALTER TABLE语句是正确的,因为它是PRODUCT_1表的属性。

现在,在将任何行插入PRODUCT_1表之前,应确保表SIZE已经有一条记录,其中新行中引用了SIZE_ID。如果数据库发现您正在尝试插入SIZE表中不存在的SIZE_ID的行,则会违反FOREIGN KEY约束,并且它将禁止您。