Liquibase未能在MySQL上添加非空、唯一的当前时间戳

Liquibase未能在MySQL上添加非空、唯一的当前时间戳,mysql,maven,spring-boot,liquibase,Mysql,Maven,Spring Boot,Liquibase,我正在自学如何使用Liquibase进行MySQL数据库版本控制和迁移 我正在进行一个SpringBoot项目,使用Maven和MySQL处理数据库 我创建了一个包含几个变更日志文件的主变更日志,直到现在一切都很好。当应用我的第一次迁移创建一个包含id、email、name、created和updated列的简单用户表时,问题就开始了 迁移运行良好,除了一件事。Liquibase没有为所有列应用NOTNULL、updated的TIMESTAMP数据类型或当前的_TIMESTAMP extra,也

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

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

我创建了一个包含几个变更日志文件的主变更日志,直到现在一切都很好。当应用我的第一次迁移创建一个包含id、email、name、created和updated列的简单用户表时,问题就开始了

迁移运行良好,除了一件事。Liquibase没有为所有列应用NOTNULL、updated的TIMESTAMP数据类型或当前的_TIMESTAMP extra,也没有忽略电子邮件列的唯一索引

我的第一次尝试是在.xml changelog上,我认为它可能是.xml格式,所以我将其更改为SQL语法。那也没用。我还先创建了表,然后添加了NOTNULL约束,但没有起作用

在这一点上,我不知道还能做什么,也找不到更多关于它的好文章或文档

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

如果我能得到任何帮助,我将不胜感激

这是我的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>
--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工作台上运行了CREATETABLE语句,没有任何问题。创建的所有约束都很好:
经过一周的研究和试验,问题在于休眠配置。在我的
application.properties
文件中,我有
spring.jpa.hibernate.ddl-auto=create drop
,这意味着根据
@实体
类,创建数据库,然后在
会话工厂关闭时删除数据库。显然,这压倒了液化行为


为了解决这个问题,我将
spring.jpa.hibernate.ddl auto
设置为
none
。然后Liquibase就可以按预期的方式工作了。

您为什么要费心处理这些XML?只需在liquibase更新中使用
alter
语句作为原始SQL。这就是我一直在做的。我做了SQL修改,正如我在文章中所描述的,一旦我意识到Liquibase无法应用我修改的SQL的约束,但得到了相同的结果。不知何故,Liquibase没有应用NOTNULL、当前的时间戳和唯一索引。XML或SQL。这不是一个分解问题。这是一个SQL问题。首先让alter在命令行中工作。那么液化就行了。如有必要,请将命令分隔为单独的更新。请看,我从帖子中获取了SQLCREATE语句,并在MySQL工作台上运行了它,没有遇到任何问题。不需要运行ALTER语句,因为CREATE表已经确定了它应该如何运行。