我正试着把外键加到我的桌子上,但它错了:
ERROR 1215 (HY000) at line 34: Cannot add foreign key constraint我检查列类型,它们是相同的类型,我不知道为什么。
我运行SHOW ENGINE INNODB STATUS
我拿到了这个:
2016-07-18 10:55:15 7f476acb6700 Error in foreign key constraint of table DGUT/staffCourse:
FOREIGN KEY (teacher) REFERENCES staff (teacher) ON DELETE CASCADE
) engine=innodb default charset=utf8:
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.这是我的密码:
CREATE TABLE staff(
id int(11) NOT NULL AUTO_INCREMENT,
department varchar(50) NOT NULL,
teacher varchar(50) NOT NULL,
gender varchar(50) NOT NULL,
title varchar(50) NOT NULL,
note1 varchar(50),
note2 varchar(50),
primary key (id)
) engine=innodb default charset=utf8;
CREATE TABLE staffCourse(
id int(11) NOT NULL AUTO_INCREMENT,
teacher varchar(50) NOT NULL,
snum varchar(50) NOT NULL,
course varchar(50),
credit varchar(50),
teachWay varchar(50),
courseType varchar(50),
classNum varchar(50),
className varchar(50),
stuNum varchar(50),
week varchar(50),
section varchar(50),
location varchar(50),
CONSTRAINT FOREIGN KEY (teacher) REFERENCES staff (teacher) ON DELETE CASCADE,
primary key (id)
) engine=innodb default charset=utf8;如有任何建议,将不胜感激。
发布于 2016-07-18 03:23:18
从技术上讲,这会让你渡过难关。teacher在staff表中没有键。在它下面。
create schema aTestDb8282;
use aTestDb8282;
drop table if exists staff;
CREATE TABLE staff(
id int(11) NOT NULL AUTO_INCREMENT,
department varchar(50) NOT NULL,
teacher varchar(50) NOT NULL,
gender varchar(50) NOT NULL,
title varchar(50) NOT NULL,
note1 varchar(50),
note2 varchar(50),
primary key (id),
key `k_my_t_keyname` (teacher)
) engine=innodb default charset=utf8;
CREATE TABLE staffCourse(
id int(11) NOT NULL AUTO_INCREMENT,
teacher varchar(50) NOT NULL,
snum varchar(50) NOT NULL,
course varchar(50),
credit varchar(50),
teachWay varchar(50),
courseType varchar(50),
classNum varchar(50),
className varchar(50),
stuNum varchar(50),
week varchar(50),
section varchar(50),
location varchar(50),
CONSTRAINT FOREIGN KEY (teacher) REFERENCES staff (teacher) ON DELETE CASCADE,
primary key (id)
) engine=innodb default charset=utf8;
drop schema aTestDb8282; -- clean up. Poof that db is gone从手册页使用外键约束
MySQL需要对外键和引用键进行索引,这样外键检查就可以快速而不需要表扫描。在“引用”表中,必须有一个索引,其中将外键列按相同顺序列为第一列。如果引用表不存在,则自动在该表上创建这样的索引。如果创建另一个可用于强制执行外键约束的索引,则稍后可能会悄悄删除此索引。如果给出了index_name,则按前面描述的方式使用。
尽管如此,我不认为这是一个好的设计。我想要一个int或类似的teacherId。也许可以回到你的staff.id,但是我需要了解你在做什么。
你所做的是模糊的。当然,该索引将指向两个或更多的工作人员(如果有复数,甚至是1,当然),以便快速查找。这就是它想要作为一个FK做的:确认。
但让我们假设有超过一个,说,是的,有一个老师叫萨利沃特金斯。但是它应该回到一个id,而不是一个可以重复的名字。这是糟糕的设计。
https://stackoverflow.com/questions/38428128
复制相似问题