2016-12-28 102 views
0

MESSAGE_MAP表mysql的錯誤號:150「外鍵約束的格式不正確」 - MariaDB的

CREATE TABLE `message_map` (
     `message_from` varchar(15) NOT NULL, 
     `message_id` varchar(15) NOT NULL, 
     `message_to` varchar(15) NOT NULL, 
     `message_status` bit(1) DEFAULT NULL 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
    ALTER TABLE `message_map` 
    ADD PRIMARY KEY (`message_from`,`message_id`,`message_to`), 
    ADD KEY `FK_ij6tystusydqijqp8lgoigo1c` (`message_id`), 

用戶表

CREATE TABLE `user` (
     `USER_ID` varchar(15) NOT NULL, 
     `PASSWORD` varchar(15) DEFAULT NULL, 
     `PHONE_NUMBER` varchar(15) DEFAULT NULL, 
     `USER_NAME` varchar(15) DEFAULT NULL, 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
    ALTER TABLE `user` 
    ADD PRIMARY KEY (`USER_ID`), 
    ADD UNIQUE KEY `USER_ID_UNIQUE` (`USER_ID`); 

我想下面的查詢申請外鍵約束

ALTER TABLE `demo`.`message_map` 
ADD CONSTRAINT `FK_MSG_MAP_USER` 
    FOREIGN KEY (`message_from`) 
    REFERENCES `demo`.`user` (`USER_ID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
ADD CONSTRAINT `FK_MSG_MAP_USER_TO` 
    FOREIGN KEY (`message_to`) 
    REFERENCES `demo`.`user` (`USER_ID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE; 

即時得到以下錯誤

錯誤1005:無法創建表<shema>#sql-1964_4(錯誤:150> 「外鍵約束被不正確地形成」)

我觀察

列(message_from,message_to)和USER_ID的數據類型是 相同。而且USER_ID也是主鍵。

問題是

出了什麼問題?

謝謝你的答案

+0

3列主鍵? – Riad

+1

您的發佈代碼包含錯誤。 –

+0

'PRIMARY KEY'是'UNIQUE'鍵。擺脫後者;這是多餘的。 –

回答

1

首先有代碼中的一些錯誤,使得它有點麻煩測試。第二,確保您使用相同的字符集兩個表中,我改變MESSAGE_MAP爲utf8:

DROP TABLE message_map; 
CREATE TABLE message_map (
    message_from varchar(15) NOT NULL, 
    message_id varchar(15) NOT NULL, 
    message_to varchar(15) NOT NULL, 
    message_status bit(1) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

ALTER TABLE message_map 
    ADD PRIMARY KEY (message_from,message_id,message_to), 
    ADD KEY FK_ij6tystusydqijqp8lgoigo1c (message_id); 

ALTER TABLE message_map 
    ADD CONSTRAINT FK_MSG_MAP_USER 
    FOREIGN KEY (message_from) 
     REFERENCES user (USER_ID) 
      ON DELETE CASCADE 
      ON UPDATE CASCADE, 
    ADD CONSTRAINT FK_MSG_MAP_USER_TO 
    FOREIGN KEY (message_to) 
     REFERENCES user (USER_ID) 
      ON DELETE CASCADE 
      ON UPDATE CASCADE; 

我刪除演示從外鍵定義。