0

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

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));

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

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

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

但是,如果我反过来说:

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

这工作正常,我无法向其中添加任何数据,它会给我诸如“无法更新子表”之类的错误。

任何帮助表示赞赏!

4

2 回答 2

1

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

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

于 2012-11-28T21:01:26.560 回答
1

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

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

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

于 2012-11-28T20:56:48.917 回答