Liquibase“modifyDataType”标签始终使列可以为空

问题描述 投票:0回答:2

当我这样做时-

<modifyDataType 
    tableName="EMCostUnit" 
    columnName="GUID" 
    newDataType="VARCHAR(50)"/>

在 liquibase 中,它总是重置可为空的约束。是否可以添加一些参数,这样它就不会删除约束,因为现在在每个

modifyDataType
之后,我需要额外的
changeSet
来添加回非空约束。

sql liquibase alter
2个回答
8
投票

根据您遇到的问题 - 您必须使用 MySQL DBMS。

如果您指的是

NOT NULL
约束,则可以将其添加为
newDataType
-

的一部分
<modifyDataType 
    tableName="EMCostUnit" 
    columnName="GUID" 
    newDataType="VARCHAR(50) NOT NULL"/>

生成的 SQL 将是:(在 MySQL 上检查)

ALTER TABLE EMCostUnit MODIFY GUID VARCHAR(50) NOT NULL;

0
投票

@orikosaki 的答案有效。但是,根据 Liquibase 的 文档

newDataType
字段将
Only modifies the data type itself and cannot define constraints

我建议在修改数据类型之后添加 addNotNullConstraint 只是为了安全并确保添加非空约束。

示例(在 yaml 中):

databaseChangeLog:
  - changeSet:
      id: 1
      author: your_name
      changes:
        - modifyDataType:
            tableName: EMCostUnit
            columnName: GUID
            newDataType: nvarchar(50)

  - changeSet:
      id: 2
      author: your_name
      changes:
        - addNotNullConstraint:
            tableName: EMCostUnit
            columnName: GUID
            columnDataType: nvarchar(max)
            constraintName: const-name

在 xml 中:

<changeSet  author="your-name"  id=1>  
    <modifyDataType 
            columnName="GUID"  
            newDataType="nvarchar(50)"
            tableName="EMCostUnit"/>  
</changeSet>
<changeSet author="your-name"  id=2>  
    <addNotNullConstraint
           columnName="GUID"  
           columnDataType="nvarchar(50)"  
           constraintName="const-name"  
           tableName="EMCostUnit"/> 
</changeSet>

请注意,在addNotNullConstraint中,mssql、mysql、informix和mariadb需要属性columnDataType。

© www.soinside.com 2019 - 2024. All rights reserved.