【问题标题】:Liquibase failed to add not null, unique, current timestamp on MySQLLiquibase 未能在 MySQL 上添加非空、唯一、当前时间戳
【发布时间】:2017-08-27 14:34:44
【问题描述】:

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

我正在使用 Maven 和 MySQL 处理数据库的 Spring Boot 项目。

我创建了一个包含多个更改日志文件的主更改日志,到目前为止一切都很好。当应用我的第一次迁移创建一个简单的用户表时,问题就开始了,其中包含 id、email、name、created 和 updated 列。

迁移运行良好,除了一件事。 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

【问题讨论】:

  • 你为什么要为所有的 XML 烦恼?只需在您的 liquibase 更新中使用 alter 语句作为原始 SQL。这就是我一直在做的事情。
  • 我按照我在帖子中描述的那样执行了 SQL ALTER,一旦我意识到 Liquibase 未能应用我更改为 SQL 的约束,但得到了相同的结果。不知何故,Liquibase 不应用 NOT NULL、CURRENT_TIMESTAMP、UNIQUE INDEX。在 XML 或 SQL 中。
  • 这不是 liquibase 问题。这是一个 SQL 问题。首先让alter在命令行中工作。然后 liquibase 将起作用。如有必要,将命令分成单独的更新。见the doc
  • 我从帖子中获取了 SQL CREATE 语句并在 MySQL Workbench 上运行它,没有任何问题。不需要运行 ALTER 语句,因为 CREATE TABLE 已经计算出它应该如何运行。

标签: mysql maven spring-boot liquibase


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 2014-03-05
    相关资源
    最近更新 更多