SQL外键约束没有失败

时间:2017-03-12 16:26:28

标签: mysql sql

我为角色,用户及其关系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);

3 个答案:

答案 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