2017-04-05 56 views
0

我遇到了SQL表問題。所以我有我的Usertable:MySQL MariaDB不會使用外鍵創建表格

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…)** 

其在德國,並表示着創建表,錯誤150,我不能看到關鍵的約束是錯誤的,我在postgreSQL中使用了相同的語法,並且它工作正常,但不知何故MySQL不接受它。有任何想法嗎?

回答

1

這很奇怪。如果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) 
); 
+0

所以如果我重新創建用戶用下面的查詢它應該工作?: CREATE TABLE IF NOT EXISTS'user'( 'ID' INT(11)NOT NULL自動遞增, 'NICKNAME' VARCHAR(50)NOT NULL, 'PASSWORD' VARCHAR(255)NOT NULL, 'EMAIL' VARCHAR(50)DEFAULT NULL, PRIMARY KEY('NICKNAME') UNIQUE KEY'ID'(' ID'), UNIQUE KEY'NICKNAME'('NICKNAME') ) –

+0

@AraLight。 。 。你的原始代碼應該可以工作,'nickname'作爲主鍵。但我會更改用戶表,所以整數列是主鍵。 –

1

用戶 - 是一個關鍵詞。

使用另一個表名稱可能是一個好主意,例如「tblUser」, 或再次使用引號``

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

確實,我會改變表名,謝謝 –

0

由於戈登·利諾夫先生我能找到我的錯誤:

我不得不宣佈暱稱聲明UNIQUE,只有國外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`) 
); 
+0

'PRIMARY KEY'是'UNIQUE KEY';你添加了一個不必要的索引。 –