Spring Boot SQL状态:90057,消息:约束条件“主键|找不到UNIQUE(USERNAME)”; SQL语句:

fnatzsnv  于 2022-11-05  发布在  Spring
关注(0)|答案(1)|浏览(123)

我在内存DB中使用h2,我有一个小的 Spring Boot 应用程序。当尝试运行测试时,我得到错误:

java.lang.IllegalStateException: Failed to load ApplicationContext

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.internal.command.DbMigrate$FlywayMigrateException: Migration V1.0.1__create_authorities_table.sql failed
-----------------------------------------------------
SQL State  : 90057
Error Code : 90057
Message    : Constraint "PRIMARY KEY | UNIQUE (USERNAME)" not found; SQL statement:

所以它说Flyway不能构建它。我只有两个sql文件:V1.0.1__create_authorities_table.sql

CREATE TABLE users
(
    id IDENTITY PRIMARY KEY,
    username            VARCHAR(50) NOT NULL,
    password        VARCHAR(68) NOT NULL,
    enabled BOOLEAN NOT NULL
);

以及V1.0.1__create_authorities_table.sql

CREATE TABLE authorities (
                             username VARCHAR(50) NOT NULL,
                             authority VARCHAR(50) NOT NULL,
                             FOREIGN KEY (username) REFERENCES users(username)
);

CREATE UNIQUE INDEX ix_auth_username on authorities (username,authority);

我发现Flyway不喜欢FOREIGN KEY (username) REFERENCES users(username),所以我也尝试了ALTER TABLE authorities ADD FOREIGN KEY (username) REFERENCES users(username),但仍然不起作用。我检查了一下,当我刚刚删除添加FOREIGN KEY时,测试是绿色的-没有错误。
从这一点看似乎是两种方式:https://stackoverflow.com/a/41515905/4952262对我来说是失败的-我在这里做错了什么?

dba5bblo

dba5bblo1#

指涉条件约束只能指涉唯一的数据行集合,必须要有主索引键或唯一的条件约束,因此您必须在users(username)上建立唯一的条件约束,才能从指涉条件约束指涉此数据行。
您只需将内联约束添加到此列的定义中:

CREATE TABLE users
(
    …
    username            VARCHAR(50) NOT NULL UNIQUE,
    …

最好从authorities表中删除username列,并添加类似于user_id BIGINT REFERENCES users(id)的列来代替它,但是,在表之间复制长值并不是一个好的做法。

相关问题