【发布时间】: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