首页 文章

Liquibase无法在MySQL上添加非空的,唯一的当前时间戳

提问于
浏览
0

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

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

我创建了一个包含多个更改日志文件的主更改日志,直到这一点都很好 . 在应用我的第一次迁移时,问题开始创建一个包含id,email,name,created和updated列的简单用户表 .

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

我的第一次尝试是在.xml更改日志上,我认为它可能是.xml格式,因此我将其更改为SQL语法 . 那也行不通 . 我还首先创建了表,然后添加了非null约束并且无效 .

此时我不知道还能做什么,我找不到更好的帖子或文档 .

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

我会非常感谢我能得到任何帮助!

这是我的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

1 回答

  • 0

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

    要解决此问题,我将 spring.jpa.hibernate.ddl-auto 设置为 none . 然后Liquibase能够按预期行事 .

相关问题