12

我有一个数据库升级脚本来删除列上的非空约束。我想做一个前置条件检查,并且ALTER TABLE只在它非空时调用。

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

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

4

3 回答 3

21

可以用 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>
    
  • 对于甲骨文:

    <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>
    
于 2015-04-28T23:03:39.550 回答
2

修改我的答案。Liquibase 支持add not null 约束操作,如下所示:

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

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

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

于 2013-07-19T18:20:10.980 回答
0

对于 PostgreSQL:

<preConditions onFail="MARK_RAN" onError="HALT">
    <sqlCheck expectedResult="NO">
        SELECT is_nullable FROM information_schema.columns
        WHERE
               table_schema = '<schema_name>'
           AND table_name   = '<table_name>'
           AND column_name  = '<column_name'
    </sqlCheck>
</preConditions>
于 2021-08-11T18:22:23.323 回答