PostgreSQL: как эффективно изменить несколько столбцов из psql? - PullRequest
6 голосов
/ 10 ноября 2010

У меня есть таблица PostgreSQL с несколькими логическими столбцами, в настоящее время содержащая только true или null.Я хочу сделать следующее для всех них:

  1. Добавить значение по умолчанию false
  2. Изменить все нулевые значения на false
  3. Добавить ограничение not null

т.е..:

-- for each column specified:
update my_table set my_column = 'f' where my_column is null;
alter table my_table alter column my_column set default 'f';
alter table my_table alter column my_column set not null; 

Есть ли функция psql (или стандартного SQL), которая будет перебирать указанный список столбцов и применять последовательность операций к каждому

Ответы [ 2 ]

15 голосов
/ 10 ноября 2010

Вы не можете перебирать все столбцы, но, чтобы быть в безопасности, вы, вероятно, не хотите этого делать в любом случае, а укажите, какие из них нужно изменить.Другим способом было бы сделать скрипт, запрашивающий имена столбцов и затем изменяющий их.

Чтобы изменить их, вы используете ALTER TABLE.См. Документацию по PgSQL: http://www.postgresql.org/docs/8.4/static/sql-altertable.html

ALTER TABLE xy ALTER COLUMN a SET DEFAULT FALSE, ALTER COLUMN b SET NOT NULL

и т. Д.

5 голосов
/ 10 ноября 2010

Для этого потребуется версия 8.4 или выше из-за VARIADIC.

CREATE OR REPLACE FUNCTION setdefaults(
    IN _tname TEXT,     -- tablename to alter
    VARIADIC _cname TEXT[]  -- all columnnames to alter
) 
RETURNS boolean 
LANGUAGE plpgsql 
AS
$$
DECLARE
    row record;
BEGIN   
    FOR row IN SELECT unnest(_cname) AS colname LOOP
        EXECUTE 'ALTER TABLE ' || quote_ident(_tname) || ' ALTER COLUMN ' || quote_ident(row.colname) || ' SET DEFAULT false;';
        EXECUTE 'UPDATE ' || quote_ident(_tname) || ' SET ' || quote_ident(row.colname) || ' = DEFAULT WHERE ' || quote_ident(row.colname) || ' IS NULL;';
        EXECUTE 'ALTER TABLE ' || quote_ident(_tname) || ' ALTER COLUMN ' || quote_ident(row.colname) || ' SET NOT NULL;';
    END LOOP;

    RETURN TRUE;
END;
$$;

SELECT setdefaults('foo', 'x','y','z'); -- alter table "foo" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...