2010-11-10 20 views
5

Tengo la tabla PostgreSQL con varias columnas booleanas, que actualmente solo contiene verdadero o nulo. Quiero hacer lo siguiente para todos ellos:PostgreSQL: ¿cómo alterar de forma eficiente varias columnas desde psql?

  1. agregar un valor predeterminado false
  2. Cambiar todos los valores nulos a falsa
  3. agregar una restricción not null

es decir .:

-- 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; 

Hay una característica de psql (o SQL estándar) que iterará sobre una lista específica de columnas y aplicar una secuencia de operaciones a cada uno?

Respuesta

4

Esto va a hacer, necesita la versión 8.4 o superior debido a la 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" 
+0

¡Brillante, gracias! Este código único está lleno de cosas útiles que no sabía. –

9

No puede iterar sobre todas las columnas, pero para estar seguro, probablemente no quiera hacer eso de todos modos, pero especifique cuáles modificar. Otra forma sería hacer una secuencia de comandos para consultar los nombres de las columnas y luego modificarlas.

Para modificarlos, usa ALTER TABLE. Ver el documento 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 

etc

+1

Gracias. Sé cómo hacerlo manualmente, pero me preguntaba si había una herramienta de iteración. Editaré para aclararlo :) También es necesario actualizar los valores nulos a falso antes de configurar 'not null', de lo contrario recibirás un error; establecer el valor predeterminado no causa la conversión automática al agregar 'not null'. –

+1

¡Apoyos para los múltiples comandos "ALTER COLUMN", separados por comas! - Nunca me di cuenta de eso en la sintaxis anterior. –

Cuestiones relacionadas