我有一個數據庫升級腳本來刪除列上的非空約束。我想做一個先決條件檢查,並且只有當它非空時才致電ALTER TABLE
。Liquibase先決條件:如何檢查不可空的列?
master.xml腳本是一種漸進式腳本,我不斷添加腳本,每次都運行整個腳本。第一次運行Alter Table腳本後,我不希望它再次運行。
無法爲此找到預定義的前提條件,也無法寫入sqlcheck。
我有一個數據庫升級腳本來刪除列上的非空約束。我想做一個先決條件檢查,並且只有當它非空時才致電ALTER TABLE
。Liquibase先決條件:如何檢查不可空的列?
master.xml腳本是一種漸進式腳本,我不斷添加腳本,每次都運行整個腳本。第一次運行Alter Table腳本後,我不希望它再次運行。
無法爲此找到預定義的前提條件,也無法寫入sqlcheck。
修改我的答案。 Liquibase支持的add not null constraint操作如下:
<changeSet author="me" id="example-001">
<addNotNullConstraint
tableName="mytable"
columnName="mycol"
columnDataType="VARCHAR(10)"
defaultNullValue="NULL"/>
</changeSet>
這種自動處理爲空,在我的示例文本字符串「NULL」填充它們的列。
我不認爲這個變更集需要一個先決條件。最糟糕的情況是,你會重新應用現有的列約束,一次。 Liquibase跟蹤所有變化並確保它們不會再次執行。
謝謝,但我不想做一個用字符串填充所有空元素的遷移腳本。 – ashes
@ashes如果該列是字符串類型(MySQL在發出MODIFY COLUMN語句時強制您指定列類型),則只填充字符串。你打算如何處理先決條件?在有NULL值列的情況下,當然你想要指定一個默認值。與不更改列類型並使您的模式處於不一致狀態相比,這要好得多。 –
可以用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>
OP標記了這個mySQL。提供該語法比解答兩個不同的問題更有幫助 – nomistic
添加了對mySQL的查詢。 –
你能用一句話總結這個問題嗎? – jaczes
如何編寫一個檢查列上存在不可空約束的前提條件? – ashes