MySQL:ERROR 1215:无法添加外键约束

时间:2016-12-11 15:04:39

标签: mysql database spring foreign-keys

我一直在尝试按照我所遇到的教程,这是关于春季安全的。在某些地方,我需要在我的数据库中创建2个表userauthorities。在执行此操作时,我正在使用此教程中建议的脚本。 http://docs.spring.io/spring-security/site/docs/3.0.x/reference/appendix-schema.html

我的数据库中已经有一个user表,所以我只需要添加autohirites表。由于我使用 MySQL ,我已经更改了以下查询:

create table authorities (
      username varchar(70) not null,
      authority varchar(50) not null,
      CONSTRAINT fk_authorities_users foreign key(username) references user(userFirstName));
      create unique index ix_auth_username on authorities (username,authority);

此外,这也是我的用户表:

CREATE TABLE `user` (
    `userId` INT(11) NOT NULL AUTO_INCREMENT,
    `userFirstName` VARCHAR(70) NOT NULL,
    `userLastName` VARCHAR(70) NOT NULL,
    `userEmail` VARCHAR(70) NOT NULL,
    `userAddress` VARCHAR(500) NULL DEFAULT NULL,
    `userPhoneNumber` INT(13) NULL DEFAULT NULL,
    `isActive` BINARY(50) NULL DEFAULT '1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0',
    `userPassword` VARCHAR(50) NOT NULL,
    `userConfirmPassword` VARCHAR(50) NOT NULL,
    PRIMARY KEY (`userId`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=2
;

当我尝试运行我要创建权限表的第一个查询时,我收到 ERROR 1215:无法添加外键约束错误。

到目前为止,我已经在下面对这些问题进行了调查,但是他们都没有回答我的问题+我认为他们都是同样的问题:

MySQL Cannot Add Foreign Key Constraint

MySQL Error 1215: Cannot add foreign key constraint

2 个答案:

答案 0 :(得分:1)

尝试将userFirstName列设为唯一。

答案 1 :(得分:1)

您还没有提到authorities的引擎是什么,您的用户表在userFirstName上没有唯一的索引,这意味着authoritiest需要是INNODB。 because

  

InnoDB允许外键约束引用非唯一键。   这是标准SQL的InnoDB扩展。

但是我根本不推荐这一点,总是最好有一个引用PRIMARY KEY的外键,这是不可能的另一个唯一键。

你真正应该做的是改变你的表格如下:

CREATE TABLE authorities (
      userid INT(11) not null,
      authority varchar(50) not null,
      CONSTRAINT fk_authorities_users foreign key(username) references user(userid));
      create unique index ix_auth_username on authorities (username,authority));

通过这样做,您引用了一个PRIMARY KEY,但更重要的是减少了表中的大量冗余。在两个表格中重复使用相同的~70字符字段绝对没有意义。