2016-07-25 133 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;現在它可以工作。 –

相關問題