为什么在聊天表中按外键时会出现此错误?
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);
答案 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;