2014-09-23 4 views
0

У меня есть база данных с 169 таблицPostgreSQL: как добавить столбец в каждую таблицу базы данных?

мне нужен этот столбец в каждой таблице:

wid integer not null primary key 

Я попробовал это (Спасибо https://stackoverflow.com/users/27535/gbn для решения):

SELECT 
    'ALTER TABLE ' + T.name + ' ADD foo int NULL' 
FROM 
    sys.tables AS T 
WHERE 
    T.is_ms_shipped = 0 

Но Ждут» t на PostgreSQL.

Он работал только на tsql.

Как добавить этот столбец в каждую таблицу одновременно?

+1

ссылка [это] (http://stackoverflow.com/a/512465/3496666) ссылка. У этого решения уже есть аналогичная проблема. – Kumar

+0

Но я хочу добавить столбец в 169 таблицах сразу. –

+0

, поэтому вы хотите добавить столбец 'wid' в каждом _tables_ в вашей базе данных ??? –

ответ

4
do $$ 
declare 
    selectrow record; 
begin 
for selectrow in 
    select 
     'ALTER TABLE '|| T.mytable || ' ADD COLUMN foo integer NULL' as script 
    from 
     ( 
     select tablename as mytable from pg_tables where schemaname ='public' --your schema name here 
    ) t 
loop 
execute selectrow.script; 
end loop; 
end; 
$$; 

Вы можете проверить всю вашу таблицы изменен с новым колонками используя ли следующее выбрать

select 
    table_name,COLUMN_NAME 
from 
    INFORMATION_SCHEMA.COLUMNS 
where 
    COLUMN_NAME='foo' -- <whatever your column name here> 
+0

Его абсолютно неправильно Крылатый. В этом случае ваша логика неверна. – 2014-09-23 11:25:37

+0

@ajay укажите причину –

+0

Как уже упоминалось, вы использовали неправильное условие цикла. – 2014-09-23 11:30:22

2

Попробуйте это (изменение «общественность» к любой схеме, которую это делается в)

DO $$ 
DECLARE 
    row record; 
    cmd text; 
BEGIN 
    FOR row IN SELECT schemaname, tablename FROM pg_tables WHERE schemaname = 'public' LOOP 
     cmd := format('ALTER TABLE %I.%I ADD COLUMN foo SERIAL PRIMARY KEY ', row.schemaname, row.tablename); 
     RAISE NOTICE '%', cmd; 
     -- EXECUTE cmd; 
    END LOOP; 
END 
$$ LANGUAGE plpgsql; 

Если вы запустите как есть, он покажет вам команды. Раскомментируйте строку EXECUTE, чтобы фактически выполнить изменения.

Я бы запустил транзакцию, чтобы вы могли откатиться, если вас не устраивают результаты.

Обратите внимание, что тип SERIAL - тип столбца будет целочисленным, но также создает последовательность, принадлежащую таблице, и по умолчанию значение столбца соответствует следующему значению этой последовательности.

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