我为角色,用户及其关系users_roles创建了表。但是我没有收到任何错误,因为users表完全为空。我可以在user_roles表中看到条目。为什么会这样?
CREATE TABLE IF NOT EXISTS role
(
id INT(11) NOT NULL AUTO_INCREMENT,
roleName VARCHAR(45) DEFAULT NULL,
PRIMARY KEY(id)
);
LOCK TABLES `role` WRITE;
ALTER TABLE `role` DISABLE KEYS ;
INSERT INTO `role` VALUES (1,'admin'),(2,'user');
ALTER TABLE `role` ENABLE KEYS ;
UNLOCK TABLES;
DROP TABLE IF EXISTS `user`;
CREATE TABLE IF NOT EXISTS `user` (
`username` varchar(45) DEFAULT NULL,
`password` varchar(100) DEFAULT NULL,
PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `users_roles`;
CREATE TABLE `users_roles` (
`username` varchar(45) NOT NULL REFERENCES user(username),
`role_id` int(11) NOT NULL REFERENCES role(id),
PRIMARY KEY (`username`,`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into users_roles values (1,1);
答案 0 :(得分:0)
我总是用一种略有不同的语法创建外键,我从来没有像你那样看过它。
DROP TABLE IF EXISTS `users_roles`;
CREATE TABLE `users_roles` (
`username` varchar(45) NOT NULL,
`role_id` int(11) NOT NULL ,
PRIMARY KEY (`username`,`role_id`),
FOREIGN KEY(role_id) REFERENCES role(id),
FOREIGN KEY(username) REFERENCES user(username)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
正如您在此处看到的那样:http://www.sqlfiddle.com/#!9/16224c,这种创建外键的方式有效。
答案 1 :(得分:0)
https://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html
你错过了users_roles中的FOREIGN KEY.REFERENCES部分应该在Dave上面显示的外键上,而不是在列上。
答案 2 :(得分:0)
column_definition 部分中的外键定义将被忽略。
重要强>
[..]
MySQL解析但忽略“内联REFERENCES规范”(如 在SQL标准中定义)其中引用被定义为部分 列规范。 MySQL只接受REFERENCES子句 当指定为单独的FOREIGN KEY规范的一部分时。
在此处找到:reference_definition