我知道这个问题发布了很多,我仔细检查了我的代码,但是当我用外键创建表时,找不到原因,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 |
你能帮我找到我的错误吗?感谢
答案 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约束。)