MySQL MariaDB不会使用外键创建Table

时间:2017-04-05 12:51:43

标签: mysql sql foreign-keys constraints mariadb

我的SQL表出现问题。所以我有我的Usertable:

CREATE TABLE IF NOT EXISTS `user` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `NICKNAME` varchar(50) NOT NULL,
  `PASSWORD` varchar(255) NOT NULL,
  `EMAIL` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`NICKNAME`),
  UNIQUE KEY `ID` (`ID`)
) ;

此表已存在且创建没有任何问题。我想创建一个这样的得分表:

CREATE TABLE IF NOT EXISTS `scores` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `NICKNAME` varchar(50) NOT NULL,
  `HIGHSCORE` int(11) NOT NULL,
  PRIMARY KEY (`ID`),
  FOREIGN KEY (NICKNAME) REFERENCES USER(Nickname)
)

在执行查询时,我得到了这个errormassage:

**#1005 - Kann Tabelle `xxxxx`.`scores` nicht erzeugen (Fehler: 150 "Foreign key constraint is incorrectly formed") (Details…)**

它用德语说不能创建Table,错误150,我无法看到键约束错误的地方,我在postgreSQL中使用相同的语法并且它工作正常,但不知何故MySQL不接受它。任何想法?

3 个答案:

答案 0 :(得分:2)

这很奇怪。如果nickname确实是主键,那么您的代码应该可以正常工作。

然而,使用自动递增列作为主键更加自然。如果您想要昵称,请在查询时使用连接。

所以:

CREATE TABLE IF NOT EXISTS `scores` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  UserId int(11) NOT NULL,
  `NICKNAME` varchar(50) NOT NULL,
  `HIGHSCORE` int(11) NOT NULL,
  PRIMARY KEY (`ID`),
  FOREIGN KEY (UserId) REFERENCES USER(Id)
);

答案 1 :(得分:1)

user - 是一个关键字。

使用其他表格名称可能是个好主意,例如“tblUser” 或再次使用引号``

FOREIGN KEY (NICKNAME) REFERENCES `USER`(ID) 

答案 2 :(得分:0)

感谢Gordon Linoff先生,我找到了错误:

我必须声明NICKNAME被声明为UNIQUE,然后才能将FOREIGN KEY约束添加到其他表中

CREATE TABLE IF NOT EXISTS `user` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `NICKNAME` varchar(50) NOT NULL,
  `PASSWORD` varchar(255) NOT NULL,
  `EMAIL` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`NICKNAME`),
  UNIQUE KEY `ID` (`ID`),
  UNIQUE KEY `NICKNAME` (`NICKNAME`)
);