Liquibase前提条件:如何检查列不可为空?

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

我有一个db升级脚本来删除列上的非null约束。我想做一个前置条件检查,并且只有当它为非null时才调用ALTER TABLE

master.xml脚本是一个渐进式脚本,我不断添加脚本,每次都运行整个脚本。我的Alter Table脚本第一次运行后,我不希望它再次运行。

无法为此找到预定义的前提条件,也无法编写sqlcheck。

mysql liquibase preconditions
2个回答
12
投票

可以用sqlCheck完成。

  • 对于MySql <preConditions onFail="MARK_RAN" onError="CONTINUE"> <sqlCheck expectedResult="NO"> SELECT is_Nullable FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='<table_name>' AND column_name='<column_name>' </sqlCheck> </preConditions>
  • 对于Oracle: <preConditions onFail="MARK_RAN" onError="CONTINUE"> <sqlCheck expectedResult="N"> SELECT Nullable FROM user_tab_columns WHERE table_name = '<table_name>' AND column_name = '<column_name>' </sqlCheck> </preConditions>
  • 对于SQL Server: <preConditions onFail="MARK_RAN" onError="CONTINUE"> <sqlCheck expectedResult="0"> SELECT is_nullable FROM sys.columns WHERE object_id = OBJECT_ID('<table_name>') AND name = '<column_name>' </sqlCheck> </preConditions>

1
投票

修改我的答案。 Liquibase支持add not null constraint操作如下:

<changeSet author="me" id="example-001">
    <addNotNullConstraint 
        tableName="mytable"    
        columnName="mycol"
        columnDataType="VARCHAR(10)"
        defaultNullValue="NULL"/>
</changeSet>

这会自动处理null的列,在我的示例中用文本字符串“NULL”填充它们。

我不认为这个变更集需要一个先决条件。最糟糕的情况是,您需要重新应用现有的列约束一次。 Liquibase跟踪所有changsets并确保它们不会再次执行。

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