2016-07-25 153 views
0

我尝试使用两个外键字段创建表锻炼。但MySQL显示我错误[1215]无法添加外键约束。我检查过父表是否已创建,并且这两个字段的类型都是相同的。还有什么可能是错的?1215无法添加外键约束

drop table if exists areas; 
drop table if exists roles; 
drop table if exists trainers; 
drop table if exists users; 
drop table if exists workouts; 
drop table if exists user_roles; 
drop table if exists trainers_areas; 

CREATE TABLE areas(
    id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    name VARCHAR(30) 
); 

CREATE TABLE roles(
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    role VARCHAR(30) 
); 

create TABLE trainers(
    id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    name VARCHAR(30) NOT NULL, 
    birthday TIMESTAMP, 
    sex CHAR(1) 
); 

create TABLE users(
    id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    name VARCHAR(30) NOT NULL, 
    email VARCHAR(20), 
    password VARCHAR(20), 
    registered TIMESTAMP DEFAULT now(), 
    enabled BOOL DEFAULT TRUE 
); 

CREATE TABLE workouts(
    id INTEGER UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    area_id INTEGER UNSIGNED NOT NULL, 
    trainer_id INTEGER UNSIGNED NOT NULL, 
    date TIMESTAMP, 
    completed BOOLEAN NOT NULL, 
CONSTRAINT FOREIGN KEY (area_id) REFERENCES areas(id), 
CONSTRAINT FOREIGN KEY (trainer_id) REFERENCES trainers(id) 
); 


CREATE TABLE users_roles(
    user_id INTEGER UNSIGNED NOT NULL, 
    role_id INTEGER UNSIGNED NOT NULL, 
    FOREIGN KEY (user_id) REFERENCES users(id), 
    FOREIGN KEY (role_id) REFERENCES roles(id) 
); 

CREATE TABLE trainers_areas(
    area_id INTEGER UNSIGNED NOT NULL, 
    treiner_id INTEGER UNSIGNED NOT NULL, 
    FOREIGN KEY (area_id) REFERENCES areas(id), 
    FOREIGN KEY (treiner_id) REFERENCES trainers(id), 
    UNIQUE (treiner_id, area_id) 
); 
+0

检查,如果所有的表是空的 – Vinie

+0

@Vinie是,他们'重新所有空,因为我创造 –

+0

重复的问题http://stackoverflow.com/q/15534977/2772563 – Slan

回答

0

在每个块之后添加ENGINE = INNODB。

+0

没有修复签名问题,没关系 – Drew

0

要找到特定的错误运行此:

SHOW ENGINE INNODB STATUS 

并期待在LATEST FOREIGN KEY ERROR部分。

子列的数据类型必须完全匹配父列。例如,由于medicalhistory.MedicalHistoryIDINT,Patient.MedicalHistory也需要是INT而不是SMALLINT

另外,在运行DDL之前,您应该运行查询set foreign_key_checks=0,以便您可以以任意顺序创建表,而不需要在相关子表之前创建所有父表。

1

数据类型必须匹配,并且SIGN也一样。如果你没有指定UNSIGNED,那么它被签名。

foreign_key_checks混在一起,在另一个答案中提到了我最不想做的事情。人们经常忘记他们做了,并猜测出现问题的位置:Stackoverflow。

下面将工作:

创建测试平台:

create schema Monday001a; 
use Monday001a; 

脚本:

drop table if exists areas; 
drop table if exists roles; 
drop table if exists trainers; 
drop table if exists users; 
drop table if exists workouts; 
drop table if exists user_roles; 
drop table if exists trainers_areas; 

CREATE TABLE areas(
    id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    name VARCHAR(30) 
); 

CREATE TABLE roles(
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    role VARCHAR(30) 
); 

create TABLE trainers(
    id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    name VARCHAR(30) NOT NULL, 
    birthday TIMESTAMP, 
    sex CHAR(1) 
); 

create TABLE users(
    id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    name VARCHAR(30) NOT NULL, 
    email VARCHAR(20), 
    password VARCHAR(20), 
    registered TIMESTAMP DEFAULT now(), 
    enabled BOOL DEFAULT TRUE 
); 

CREATE TABLE workouts(
    id INTEGER UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    area_id INTEGER UNSIGNED NOT NULL, 
    trainer_id INTEGER UNSIGNED NOT NULL, 
    date TIMESTAMP, 
    completed BOOLEAN NOT NULL, 
CONSTRAINT FOREIGN KEY (area_id) REFERENCES areas(id), 
CONSTRAINT FOREIGN KEY (trainer_id) REFERENCES trainers(id) 
); 


CREATE TABLE users_roles(
    user_id INTEGER UNSIGNED NOT NULL, 
    role_id INTEGER UNSIGNED NOT NULL, 
    FOREIGN KEY (user_id) REFERENCES users(id), 
    FOREIGN KEY (role_id) REFERENCES roles(id) 
); 

CREATE TABLE trainers_areas(
    area_id INTEGER UNSIGNED NOT NULL, 
    treiner_id INTEGER UNSIGNED NOT NULL, 
    FOREIGN KEY (area_id) REFERENCES areas(id), 
    FOREIGN KEY (treiner_id) REFERENCES trainers(id), 
    UNIQUE (treiner_id, area_id) 
); 

清理:

drop schema Monday001a; 

从有权MySQL的手册:

外键中的相应列和引用键必须为 具有相似的数据类型。整数类型的大小和符号必须是 一样。字符串类型的长度不需要相同。对于 非二进制(字符)字符串列,字符集和校对 必须相同。

+0

它不起作用 –

+0

在这里很好用。 Mysql工作台和MySQL 5.6.24。我不发布我不测试的东西。 – Drew

+0

我在每个块之后添加了ENGINE = INNODB;现在它可以工作。 –

相关问题