MySQL查询中的这个错误是什么?

时间:2015-07-25 04:48:09

标签: mysql mysql-workbench

为什么在聊天表中按外键时会出现此错误?

create table user ( id int NOT NULL auto_increment,
    userId int, username varchar(250),
    useremail varchar(250),
primary key(id,userId));

CREATE table chat ( Id int NOT NULL auto_increment,
   userId int, chatmsg varchar(250),  time timestamp,
   primary key(id),  
   foreign key (userId) references user (userId) 
       on update cascade on delete cascade);

3 个答案:

答案 0 :(得分:2)

user上没有索引,其前导列为userid。 (这就是InnoDB在FOREIGN KEY定义上抛出错误的原因.InnoDB要求有一个合适的索引。)

如果将元组(id, userid)定义为user表的PRIMARY KEY,则规范模式将用于引用这两列的外键引用。

但是你真的需要将两列的组合作为PRIMARY KEY吗?

例如:

CREATE TABLE user 
( 
     id INT NOT NULL AUTO_INCREMENT COMMENT 'pk',
     username VARCHAR(250),
     useremail VARCHAR(250), 
     PRIMARY KEY (id)
);

CREATE TABLE chat
( 
     id INT NOT NULL AUTO_INCREMENT COMMENT 'pk',
     user_id INT COMMENT 'fk ref user(id)', 
     chatmsg VARCHAR(250),
     time TIMESTAMP,
     PRIMARY KEY (id),
     CONSTRAINT FK_chat_user
         FOREIGN KEY (user_id) REFERENCES user (id)
             ON UPDATE CASCADE ON DELETE CASCADE
);

如果您始终希望与chat相关联的user中有一行,那么您可以通过将NOT NULL添加到user_id chat列来强制执行该行1}}。

答案 1 :(得分:0)

以这种方式声明用户表

create table user ( 
     id        int NOT NULL auto_increment, 
     userId    int, 
     username  varchar(250), 
     useremail varchar(250), 
     primary key(id), key(userId)
);

答案 2 :(得分:0)

尝试以下查询来创建表格:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) DEFAULT NULL,
  `username` varchar(250) DEFAULT NULL,
  `useremail` varchar(250) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `userId_UNIQUE` (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `chat` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) DEFAULT NULL,
  `chatmsg` varchar(250) DEFAULT NULL,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`Id`),
  KEY `fk_userid_idx` (`userId`),
  CONSTRAINT `fk_userid` FOREIGN KEY (`userId`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;