gpt4 book ai didi

mysql - Liquibase 无法在 MySQL 上添加非空、唯一、当前时间戳

转载 作者:行者123 更新时间:2023-11-29 19:09:50 25 4
gpt4 key购买 nike

我正在自学如何使用 Liquibase 进行 MySQL 数据库版本控制和迁移。

我正在进行一个 Spring Boot 项目,使用 Maven 和 MySQL 来处理数据库。

我创建了一个主变更日志来包含多个变更日志文件,到目前为止一切都很好。当应用我的第一次迁移创建一个包含 id、电子邮件、名称、创建和更新列的简单用户表时,问题就开始了。

除了一件事之外,迁移运行良好。 Liquibase 不会对所有列应用 NOT NULL、更新的 TIMESTAMP 数据类型或 CURRENT_TIMESTAMP 额外内容,并且还会忽略电子邮件列的唯一索引。

我的第一次尝试是在 .xml 更改日志上,我认为它可能是 .xml 格式,因此我将其更改为 SQL 语法。那也没用。我也先创建了表,然后添加了非空约束,但没有成功。

此时我不知道还能做什么,也找不到任何关于它的更好的帖子或文档。

注意:它应用的唯一“特殊”约束是主键和自动增量,并忽略所有其他功能。

如果我能得到任何帮助,我将非常感激!

这是我的 liquibase.properties:

url = jdbc:mysql://localhost/skullproject
username = skull
password = skullpass
driver = com.mysql.jdbc.Driver

这是我的迁移 XML 更改日志:

<changeSet id="1" author="f6rnando">
<createTable tableName="user">
<column autoIncrement="true" name="id" type="BIGINT">
<constraints primaryKey="true" nullable="false" />
</column>
<column name="email" type="VARCHAR(80)">
<constraints nullable="false" />
</column>
<column name="password" type="VARCHAR(80)">
<constraints nullable="false" />
</column>
<column name="name" type="VARCHAR(80)">
<constraints nullable="false" />
</column>
<column name="updated" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP">
<constraints nullable="false" />
</column>
<column name="created" type="DATETIME">
<constraints nullable="false" />
</column>
</createTable>
</changeSet>

<changeSet author="f6rnando" id="1491156436761-3">
<addUniqueConstraint columnNames="email"
constraintName="email_UNIQUE" tableName="user" />
</changeSet>

这是我的 MySQL 变更日志:

--liquibase formatted sql

--changeset f6rnando:1
CREATE TABLE user (
id BIGINT NOT NULL AUTO_INCREMENT,
email VARCHAR(80) NOT NULL,
password VARCHAR(80) NOT NULL,
name VARCHAR(80) NOT NULL,
updated TIMESTAMP NOT NULL DEFAULT current_timestamp,
created DATETIME NOT NULL,
PRIMARY KEY (id),
UNIQUE INDEX email_UNIQUE (email ASC)
);

--changeset f6rnando:2
ALTER TABLE user MODIFY email VARCHAR(80) NOT NULL;

--changeset f6rnando:3
ALTER TABLE user MODIFY password VARCHAR(80) NOT NULL;

尝试了所有方法后,结果始终相同: MySQL Table info

我在 MySQL Workbench 上运行了 CREATE TABLE 语句,没有遇到任何问题。所有的约束都创建得很好: MySQL Table executed on Workbench

最佳答案

经过一周的研究和试验,问题出在 Hibernate 配置上。在我的 application.properties 文件中,我有 spring.jpa.hibernate.ddl-auto = create-drop ,这意味着根据 @Entity 类,数据库被创建,然后在 SessionFactory 关闭时被删除。显然这会覆盖 Liquibase 行为。

为了解决这个问题,我将spring.jpa.hibernate.ddl-auto设置为none。然后 Liquibase 就能够按预期运行。

关于mysql - Liquibase 无法在 MySQL 上添加非空、唯一、当前时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43172564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com