2015-10-05 172 views
1

我想调试一个简单的SQL数据库。我不断收到写着外键约束错误

SQL query: 


CREATE TABLE Groups (
    groupId   int(11) NOT NULL AUTO_INCREMENT, 
    leaderId   int(11) NOT NULL COLLATE utf8_unicode_ci, 
    sportId   int(11) NOT NULL COLLATE utf8_unicode_ci, 
    groupName   varchar(255) COLLATE utf8_unicode_ci, 
    membersName  varchar(255) COLLATE utf8_unicode_ci, 
    groupDes   TEXT CHARACTER SET latin1 COLLATE latin1_general_cs, 
    dateCreated TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (groupId), 
    FOREIGN KEY (sportId) REFERENCES Sports(sportId), 
    FOREIGN KEY (leaderId) REFERENCES Users(userId) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 
MySQL said: Documentation 

#1215 - Cannot add foreign key constraint 

我知道,这是外键(sportId)参考文献体育(sportId),行,因为当我删除它,我没有错误,一切都很好错误。我的运动桌上可能有些问题,或者只是语法错误,但我似乎无法看到它。有人请告诉我我疯了,它是一个简单的语法问题。这是我正在写的完整数据库文件。

DROP DATABASE if EXISTS sqlfile; 
CREATE DATABASE sqlfile; 
USE sqlfile; 

DROP TABLE if EXISTS Users; 
CREATE TABLE Users (
    userId    int(11) NOT NULL AUTO_INCREMENT, 
    userName   varchar (255) UNIQUE NOT NULL COLLATE utf8_unicode_ci, 
    password   varchar(255) COLLATE utf8_unicode_ci, 
    firstName   varchar(255) COLLATE utf8_unicode_ci, 
    lastName   varchar(255) COLLATE utf8_unicode_ci, 
    tel    char(10) COLLATE utf8_unicode_ci, 
    dateCreated TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (userId) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

CREATE TABLE Groups (
    groupId   int(11) NOT NULL AUTO_INCREMENT, 
    leaderId   int(11) NOT NULL COLLATE utf8_unicode_ci, 
    sportId   int(11) NOT NULL COLLATE utf8_unicode_ci, 
    groupName   varchar(255) COLLATE utf8_unicode_ci, 
    membersName  varchar(255) COLLATE utf8_unicode_ci, 
    groupDes   TEXT CHARACTER SET latin1 COLLATE latin1_general_cs, 
    dateCreated TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (groupId), 
    FOREIGN KEY (sportId) REFERENCES Sports(sportId), 
    FOREIGN KEY (leaderId) REFERENCES Users(userId) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

CREATE TABLE Members (
    memberId   int(11) NOT NULL AUTO_INCREMENT, 
    groupId   int(11) NOT NULL COLLATE utf8_unicode_ci, 
    userId    int(11) NOT NULL COLLATE utf8_unicode_ci, 
    dateCreated TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (memberId), 
    FOREIGN KEY (groupId) REFERENCES Groups(groupId), 
    FOREIGN KEY (userId) REFERENCES Users(userId) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

CREATE TABLE Sports (
    sportId   int(11) NOT NULL AUTO_INCREMENT, 
    sportName   varchar(255) COLLATE utf8_unicode_ci, 
    dateCreated TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (sportId) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

回答

3

您需要首先创建你的运动表,以便有成群表的外键参考

DROP TABLE if EXISTS Users; 
CREATE TABLE Users (
.... 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 
CREATE TABLE Sports (
.... 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 
CREATE TABLE Groups (
.... 
    FOREIGN KEY (sportId) REFERENCES Sports(sportId), 
    FOREIGN KEY (leaderId) REFERENCES Users(userId) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

CREATE TABLE Members (
.... 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

DEMO

+0

工作。我对sql很新,谢谢! –

0

从检查MySQL的转储输出....

/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 

[your CREATEs here] 

/*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */; 

除了单独添加约束,这是我所知的唯一的其他方法甚至创建以某种循环或互惠方式相互引用的表格(而不是您的结构)。

0

您需要在组之前创建体育桌,或者在您有体育桌后在最后添加约束。

DROP DATABASE if EXISTS classbash; 
CREATE DATABASE classbash; 
USE classbash; 

DROP TABLE if EXISTS Users; 
CREATE TABLE Users (
    userId    int(11) NOT NULL AUTO_INCREMENT, 
    userName   varchar (255) UNIQUE NOT NULL COLLATE utf8_unicode_ci, 
    password   varchar(255) COLLATE utf8_unicode_ci, 
    firstName   varchar(255) COLLATE utf8_unicode_ci, 
    lastName   varchar(255) COLLATE utf8_unicode_ci, 
    tel    char(10) COLLATE utf8_unicode_ci, 
    dateCreated TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (userId) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

CREATE TABLE Sports (
    sportId   int(11) NOT NULL AUTO_INCREMENT, 
    sportName   varchar(255) COLLATE utf8_unicode_ci, 
    dateCreated TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (sportId) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

CREATE TABLE Groups (
    groupId   int(11) NOT NULL AUTO_INCREMENT, 
    leaderId   int(11) NOT NULL COLLATE utf8_unicode_ci, 
    sportId   int(11) NOT NULL COLLATE utf8_unicode_ci, 
    groupName   varchar(255) COLLATE utf8_unicode_ci, 
    membersName  varchar(255) COLLATE utf8_unicode_ci, 
    groupDes   TEXT CHARACTER SET latin1 COLLATE latin1_general_cs, 
    dateCreated TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (groupId), 
    FOREIGN KEY (sportId) REFERENCES Sports(sportId), 
    FOREIGN KEY (leaderId) REFERENCES Users(userId) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

CREATE TABLE Members (
    memberId   int(11) NOT NULL AUTO_INCREMENT, 
    groupId   int(11) NOT NULL COLLATE utf8_unicode_ci, 
    userId    int(11) NOT NULL COLLATE utf8_unicode_ci, 
    dateCreated TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (memberId), 
    FOREIGN KEY (groupId) REFERENCES Groups(groupId), 
    FOREIGN KEY (userId) REFERENCES Users(userId) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;