2013-07-19 46 views
4

我有一個數據庫升級腳本來刪除列上的非空約束。我想做一個先決條件檢查,並且只有當它非空時才致電ALTER TABLELiquibase先決條件:如何檢查不可空的列?

master.xml腳本是一種漸進式腳本,我不斷添加腳本,每次都運行整個腳本。第一次運行Alter Table腳本後,我不希望它再次運行。

無法爲此找到預定義的前提條件,也無法寫入sqlcheck。

+0

你能用一句話總結這個問題嗎? – jaczes

+0

如何編寫一個檢查列上存在不可空約束的前提條件? – ashes

回答

1

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

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

這種自動處理爲空,在我的示例文本字符串「NULL」填充它們的列。

我不認爲這個變更集需要一個先決條件。最糟糕的情況是,你會重新應用現有的列約束,一次。 Liquibase跟蹤所有變化並確保它們不會再次執行。

+0

謝謝,但我不想做一個用字符串填充所有空元素的遷移腳本。 – ashes

+0

@ashes如果該列是字符串類型(MySQL在發出MODIFY COLUMN語句時強制您指定列類型),則只填充字符串。你打算如何處理先決條件?在有NULL值列的情況下,當然你想要指定一個默認值。與不更改列類型並使您的模式處於不一致狀態相比,這要好得多。 –

8

可以用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> 
    
+0

OP標記了這個mySQL。提供該語法比解答兩個不同的問題更有幫助 – nomistic

+1

添加了對mySQL的查詢。 –