2014-01-24 117 views
0

我們已將數據庫從int升級到bigint。不過,我們希望選擇遷移回最後一個選項。那時我們需要將數據庫改回來。SQL:遍歷數據庫中的所有列並更改類型

因此,基本上遍歷所有表和列,如果類型== bigint更改爲int。到目前爲止,我還沒有找到一個好辦法來做到這一點。

我們支持bot postgres sql和sql server。不確定這可以以統一的方式完成,或者如果需要兩個版本。

回答

2

您可以簡單地生成ALTER語句

SELECT 'ALTER TABLE ' + TABLE_NAME + ' ALTER COLUMN ' + COLUMN_NAME + ' INT ' + CASE when IS_NULLABLE = 'NO' THEN 'NOT' END + ' NULL' + char(13) + 'GO' 

FROM INFORMATION_SCHEMA.COLUMNS 
WHERE DATA_TYPE = 'bigint' 
+1

...和information_schema是標準的,儘管有時候類型名稱之類的東西會有所不同,所以對於類型名稱差異可能需要某些OR或CASE語句。 –

0

你可以在PostgreSQL創建一個函數來做到這一點:

CREATE OR REPLACE FUNCTION bigint_to_int() RETURNS VOID AS $$ 
DECLARE 

    m_Record RECORD; 

BEGIN 

    FOR m_Record IN 
    SELECT information_schema.columns.table_name, information_schema.columns.column_name 
    FROM information_schema.columns 
    WHERE information_schema.columns.data_type = 'bigint' 
    AND information_schema.columns.table_schema = 'public' 
    LOOP 

     EXECUTE 'ALTER TABLE ' || QUOTE_IDENT(m_Record.table_name) || ' ALTER COLUMN ' || QUOTE_IDENT(m_Record.column_name) || ' TYPE INTEGER;'; 

    END LOOP; 

END; 
$$ LANGUAGE plpgsql VOLATILE; 

然後,你可以調用它使用:

SELECT bigint_to_int(); 

你將不得不在SQL Server中做同樣的事情,儘管...

相關問題