2014-01-24 10 views
0

Мы обновили нашу базу данных до bigint из int. Однако мы хотели бы, чтобы опция была перенесена в качестве последней опции. В этот момент нам нужно будет изменить базу данных.SQL: Пронумеруйте все столбцы в базе данных и измените тип

Так что в основном перебирайте все таблицы и столбцы, и если тип == bigint изменяется на int. До сих пор я не нашел хорошего способа сделать это.

Мы поддерживаем сервер ботов postgres sql и sql. Не уверен, что это может быть сделано унифицированным способом или если требуются две версии.

ответ

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, хотя ...

Смежные вопросы