Mysql SQL外键约束未失败

Mysql SQL外键约束未失败,mysql,sql,Mysql,Sql,我已经为角色、用户及其关系用户创建了表。但是我没有收到任何错误,因为用户表是完全空的。我可以在用户角色表中看到条目。为什么会这样 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`

我已经为角色、用户及其关系用户创建了表。但是我没有收到任何错误,因为用户表是完全空的。我可以在用户角色表中看到条目。为什么会这样

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);

我总是用稍微不同的语法创建外键,我从来没有见过你使用它的方式

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;
正如您在这里看到的:,这种创建外键的方法很有效。


用户角色中缺少外键。引用部分应位于外键上,如Dave所示,而不是列上。

列定义部分中的外键定义将被忽略

重要

[……]

MySQL解析但忽略“内联引用规范”(如 在SQL标准中定义),其中引用被定义为 列规范的一部分。MySQL只接受REFERENCES子句 当指定为单独外键规范的一部分时


在这里找到:

这里有一个SQL提琴:。我发现这很奇怪。表user中的user\u id在哪里,然后表users\u角色有主键(
user\u id
role\u id
)?运行
show create table users\u roles
)。你会看到,没有FK。