无法在mysql中使用外键创建表

时间:2013-01-11 18:24:02

标签: mysql foreign-keys

我知道这个问题发布了很多,我仔细检查了我的代码,但是当我用外键创建表时,找不到原因,mysql给了我一个错误。

mysql> CREATE TABLE Act_Model(
    -> code VARCHAR(8) NOT NULL,
    -> model VARCHAR(64) NOT NULL,
    -> PRIMARY KEY (code))ENGINE = INNODB;
Query OK, 0 rows affected (0.09 sec)
mysql> CREATE TABLE IBT_ActItem(
    -> model VARCHAR(64) NOT NULL,
    -> flagbit BIGINT(20) UNSIGNED NOT NULL DEFAULT '0',
    -> PRIMARY KEY(model),
    -> FOREIGN KEY( model) REFERENCES Act_Model(model))ENGINE = INNODB;
ERROR 1005 (HY000): Can't create table 'test.ibt_actitem' (errno: 150)
mysql> CREATE TABLE IBT_ActItem(
    -> model VARCHAR(64) NOT NULL,
    -> flagbit BIGINT(20) UNSIGNED NOT NULL DEFAULT '0',
    -> PRIMARY KEY(model))ENGINE = INNODB;
Query OK, 0 rows affected (0.09 sec)

当我使用show engins;时,对于InnoDB,它给了我:

| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |

你能帮我找到我的错误吗?感谢

2 个答案:

答案 0 :(得分:4)

您需要在父表中的模型列上添加唯一索引:

CREATE TABLE Act_Model(
 code VARCHAR(8) NOT NULL,
 model VARCHAR(64) NOT NULL,
 PRIMARY KEY (code),
 UNIQUE KEY model (model)
 )ENGINE = INNODB;

答案 1 :(得分:0)

MySQL要求您对作为FOREIGN KEY约束的目标的列具有UNIQUE KEY或PRIMARY KEY约束。

要添加唯一键,您可以使用以下语法:

ALTER TABLE Act_Model ADD CONSTRAINT Act_Model_UX UNIQUE KEY (model) ;

您已将model列定义为IBT_ActItem表中的PRIMARY KEY。

如果您在另一个表(UNIQUE KEY)的FOREIGN KEY列上添加model约束和Act_Model约束,则您实际上指定的是“ to-one(可选)“这两个表之间的关系。

UNIQUE(或PRIMARY)KEY在父表上进行,父表是“一对多”关系的“一”侧。 FOREIGN KEY在子表上,这是关系的“零,一或多”方面。


(规范性做法是让外键引用目标表的主键。要使model列而不是code列成为主键:

ALTER TABLE Act_Model DROP PRIMARY KEY ;
ALTER TABLE Act_Model ADD PRIMARY KEY (model) ;

注意:UNIQUE KEY和PRIMARY KEY之间存在一些显着差异。例如,在表上只能定义一个PRIMARY KEY,并且PRIMARY KEY约束对列强制执行NOT NULL约束。)