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

     2023-02-26     290

关键词:

【中文标题】Liquibase 未能在 MySQL 上添加非空、唯一、当前时间戳【英文标题】:Liquibase failed to add not null, unique, current timestamp on 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 已经计算出它应该如何运行。 【参考方案1】:

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

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

【讨论】:

如何在 liquibase OracleDatabase 中添加保留关键字?

】如何在liquibaseOracleDatabase中添加保留关键字?【英文标题】:HowtoaddreservedkeywordsinliquibaseOracleDatabase?【发布时间】:2021-11-2706:52:45【问题描述】:试图使我的SpringBootJPA应用程序与OracleDB兼容,已经在MySQL和H2上运行。不幸的是,l... 查看详情

在现有数据库上使用 liquibase

】在现有数据库上使用liquibase【英文标题】:Usingliquibaseontheexistingdatabase【发布时间】:2013-05-0313:34:50【问题描述】:我们有一个生产中的现有数据库。我们决定使用liquibase进行所有进一步的更新并创建任何新的数据库(如开发... 查看详情

sql创建具有所有权力的liquibase用户。在vagrantbox上执行这些命令。登录到框中,执行“mysql”然后输入每个(代码片段)

查看详情

mac上显示“未能载入偏好设置面板“mysql”。”

...板,想启动mysql服务,但是点击后,就出现了这个消息“未能载入偏好设置面板“MySQL"。”,有谁知道怎么回事,截图如下:参考技术A安装mysql版本:5.7.21去偏好设置启动时报错:未能载入偏好设置面板“MySQL”1)原因:mac... 查看详情

indexedDB 创建数据库并添加内容未能在“IDBDatabase”上执行“事务”

】indexedDB创建数据库并添加内容未能在“IDBDatabase”上执行“事务”【英文标题】:indexedDBCreatingadatabaseandaddingcontentFailedtoexecute\'transaction\'on\'IDBDatabase\'【发布时间】:2016-08-2514:59:17【问题描述】:这是我第一次使用indexDB,我已... 查看详情

Liquibase 主键在 H2 上创建了两次

】Liquibase主键在H2上创建了两次【英文标题】:LiquibaseprimarykeyiscreatedtwiceonH2【发布时间】:2015-12-1422:19:07【问题描述】:一开始的问题只是H2数据库。在其他数据库(MySQL)上它工作得很好,没有问题。由(jHipster)生成的配置:个... 查看详情

必须在 Liquibase 上指定 changeLogFile 错误

】必须在Liquibase上指定changeLogFile错误【英文标题】:ThechangeLogFilemustbespecifiederroronLiquibase【发布时间】:2020-06-2104:05:46【问题描述】:我是Liquibase的新手,我尝试将liquibase与postgres数据库一起使用,以使用liquibase脚本创建数据库... 查看详情

如果在 MYSQL 中使用 liquibase,则删除外键

】如果在MYSQL中使用liquibase,则删除外键【英文标题】:DropforeignkeyifexistsusingliquibaseinMYSQL【发布时间】:2018-10-1006:25:18【问题描述】:我想问一下,有没有办法只在外键约束存在时才删除它?我当前的变更集如下所示:<changeSe... 查看详情

mysql中一个数据表只可以定一个非空字段吗

...的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。可以通过CREATETABLE或ALTERTABLE语句实现。在表中某个列的定义后加上关键字NOTNULL作为限定词,来约束该列的取值不能为空。... 查看详情

无法与 liquibase gradle 插件生成差异

】无法与liquibasegradle插件生成差异【英文标题】:Unabletogeneratedifferencefromliquibasegradleplugin【发布时间】:2016-06-1311:38:56【问题描述】:我正在尝试使用MYSQL数据库在现有SpringBoot项目中实现liquibase。我希望能够生成更改集,指定实... 查看详情

将 Liquibase 引入现有项目和 MySQL

】将Liquibase引入现有项目和MySQL【英文标题】:LiquibaseintroductionintoanexistingprojectandMySQL【发布时间】:2015-03-0912:00:42【问题描述】:我们有一个现有的Java项目,它建立在MySQL数据库之上,我们依赖于MySQL特定的设置和迁移机制来实... 查看详情

AWS Opsworks 未能添加 EC2 实例

】AWSOpsworks未能添加EC2实例【英文标题】:AWSOpsworksfailedtoaddEC2instance【发布时间】:2020-04-1120:57:19【问题描述】:我创建了新的EC2实例,并在Opsworks上创建了新层。我运行了一个显示在Opsworks面板上的命令,但它一直无法在Opsworks... 查看详情

如何使用 MYSQL 中的连接从多个表中获取多个列并在非空列上显示数据以及在空列上显示 null 或零

】如何使用MYSQL中的连接从多个表中获取多个列并在非空列上显示数据以及在空列上显示null或零【英文标题】:HowtofetchmultiplecolumnsfrommultipletableandshowdataonnonemptycolumnsandnullorzeroonemptycolumnsusingjoinsinMYSQL【发布时间】:2014-11-2503:18:01... 查看详情

约束未能添加填充

】约束未能添加填充【英文标题】:Constraintsfailingtoaddpadding【发布时间】:2018-10-2408:46:42【问题描述】:我正在开发一个最终将成为按钮的自定义控件。我已经成功地在界面构建器中构建了设计,但是当我尝试以编程方式构建相... 查看详情

如何使用 php 从 mySQL DB 中的两个表中添加非空值?

】如何使用php从mySQLDB中的两个表中添加非空值?【英文标题】:Howtoaddnon-emptyvaluesfromtwotablesinmySQLDBusingphp?【发布时间】:2021-08-2022:07:17【问题描述】:我在mysql数据库中有两个表。table_1和table_2这两个表都有4列供用户使用user_1、... 查看详情

「mysql」-约束详解(代码片段)

目录约束的认识非空约束(notnull)1.创建数据表添加非空约束2.现有数据表添加非空约束3.删除非空约束唯一约束(unique)1.创建表添加唯一约束2.现有数据表添加非空约束3.删除唯一约束默认约束(default)1.创建表添加默认约束2.现有表中... 查看详情

Liquibase:MySQL 存储过程中的 SQL 语法错误

】Liquibase:MySQL存储过程中的SQL语法错误【英文标题】:Liquibase:SQLsyntaxerrorinaMySQLstoredprocedure【发布时间】:2018-02-1610:36:01【问题描述】:我尝试通过Liquibase运行MySQL存储过程SQL脚本,但没有成功。db.storedprocedure.xml的内容:<chan... 查看详情

即使数据库解锁,liquibase 锁定异常

】即使数据库解锁,liquibase锁定异常【英文标题】:liquibaseLockExceptionevenwhenDBunlocked【发布时间】:2014-10-3118:40:43【问题描述】:我的应用程序部署在tomcat7上。它连接到后端的MySql数据库。我在“核心”模式中配置了DATABASECHANGELOG... 查看详情