【发布时间】:2015-12-19 18:08:00
【问题描述】:
我正在尝试使用 Liquibase 将一个数据库转换为另一个数据库。我有两个数据库,想在其中一个上运行 SQL 脚本,使其与另一个相同。我正在使用 Liquibase 3.4.1 版和两个 H2 数据库。为了生成 SQL 脚本,我首先使用 diffChangeLog 命令生成 diff xml,该命令运行良好。 (实际上有一个问题:它会生成类型为 VARCHAR 且 autoIncrement 设置为 true 的列,但可以手动删除)。然后我使用命令 updateSQL 从 diff xml 生成 SQL 文件。 SQL 文件包含以下行:
ALTER TABLE PUBLIC.USERS ADD ENABLED BOOLEAN(1) NOT NULL;
最初,db 包含一个名为 USERS 的表,其中包含两列:USER 和 PASSWORD,其中包含一行数据(user1,password)。 SQL 脚本此时失败,因为它试图创建一个新列,其第一行的条目将设置为 NULL,但该列应该为 NOT NULL。错误是:
错误:“ENABLED”列不允许为 NULL;
SQL 语句:
ALTER TABLE PUBLIC.USERS ADD ENABLED BOOLEAN(1) NOT NULL[23502-187]SQL 状态:23502
错误代码:23502
错误发生在:
ALTER TABLE PUBLIC.USERS ADD ENABLED BOOLEAN(1) NOT NULL
我可以尝试手动删除 NOT NULL 条件,但这并不适用于所有情况,如下所述。当我删除 NOT NULL 时,会发生这种情况:
执行以下行时发生另一个相关错误(就在上面的行之后):
ALTER TABLE PUBLIC.USERS ADD USERNAME VARCHAR(50) NOT NULL;
请注意,它正在尝试添加列“USERNAME”,而不是原始数据库已有的“USER”。
它给出了同样的错误,当我删除 NOT NULL 时,又出现了另一个错误:
错误:列“USERNAME”不能为空;
SQL语句:
ALTER TABLE PUBLIC.USERS ADD CONSTRAINT CONSTRAINT_4 PRIMARY KEY (USERNAME)[90023-187]SQL 状态:90023
错误代码:90023
错误发生在:
ALTER TABLE PUBLIC.USERS ADD CONSTRAINT CONSTRAINT_4 PRIMARY KEY (USERNAME)
由于列是主键,它不能为空。
有没有办法轻松解决这个问题? Liquibase 中是否有一个选项可以消除这些错误?
【问题讨论】: