添加一个时出现一些外键错误。我有:
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)
这工作正常,我无法向它添加任何数据,它给我一个错误,如“无法更新子表”。
任何帮助表示赞赏!
答案 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约束,并且它将禁止您。