MySQL MariaDB 不会使用外键创建 Table
MySQL MariaDB wont create Table with a foreign key
我的 SQL Table 有问题。所以我有我的用户table:
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`)
) ;
这个 table 已经存在并且创建时没有任何问题。我想像这样创建乐谱 Table:
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)
)
在执行查询时我得到了这个错误消息:
**#1005 - Kann Tabelle `xxxxx`.`scores` nicht erzeugen (Fehler: 150 "Foreign key constraint is incorrectly formed") (Details…)**
它是德语的,说不能创建 Table,错误 150,我看不出关键约束在哪里错误,我在 postgreSQL 中使用了相同的语法并且它工作正常,但不知何故MySQL 不接受。有什么想法吗?
这很奇怪。如果 nickname
确实是主键,那么您的代码应该可以工作。
不过,使用自增列作为主键更为自然。如果你想要昵称,那么在查询的时候使用join。
所以:
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)
);
user - 是关键字。
使用另一个 table 名称可能是个好主意,例如"tblUser",
或者再次使用引号``
FOREIGN KEY (NICKNAME) REFERENCES `USER`(ID)
多亏了 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`)
);
我的 SQL Table 有问题。所以我有我的用户table:
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`)
) ;
这个 table 已经存在并且创建时没有任何问题。我想像这样创建乐谱 Table:
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)
)
在执行查询时我得到了这个错误消息:
**#1005 - Kann Tabelle `xxxxx`.`scores` nicht erzeugen (Fehler: 150 "Foreign key constraint is incorrectly formed") (Details…)**
它是德语的,说不能创建 Table,错误 150,我看不出关键约束在哪里错误,我在 postgreSQL 中使用了相同的语法并且它工作正常,但不知何故MySQL 不接受。有什么想法吗?
这很奇怪。如果 nickname
确实是主键,那么您的代码应该可以工作。
不过,使用自增列作为主键更为自然。如果你想要昵称,那么在查询的时候使用join。
所以:
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)
);
user - 是关键字。
使用另一个 table 名称可能是个好主意,例如"tblUser", 或者再次使用引号``
FOREIGN KEY (NICKNAME) REFERENCES `USER`(ID)
多亏了 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`)
);