2016-12-28 103 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; 

我删除演示从外键定义。