首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL不能添加外键约束吗?

问MYSQL不能添加外键约束吗?
EN

Stack Overflow用户
提问于 2016-07-18 03:18:53
回答 1查看 1.5K关注 0票数 1

我正试着把外键加到我的桌子上,但它错了:

代码语言:javascript
复制
ERROR 1215 (HY000) at line 34: Cannot add foreign key constraint

我检查列类型,它们是相同的类型,我不知道为什么。

我运行SHOW ENGINE INNODB STATUS

我拿到了这个:

代码语言:javascript
复制
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.

这是我的密码:

代码语言:javascript
复制
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;

如有任何建议,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-18 03:23:18

从技术上讲,这会让你渡过难关。teacher在staff表中没有键。在它下面。

代码语言:javascript
复制
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,而不是一个可以重复的名字。这是糟糕的设计。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38428128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档