2011-03-11 14 views
50

¿Cómo puedo soltar un nombre de restricción en Postgresql simplemente conociendo el nombre? Tengo una lista de restricciones autogeneradas por un script de terceros. Necesito eliminarlos sin conocer el nombre de la tabla solo el nombre de la restricción.Limitar restricción por nombre en Postgresql

+0

¿Qué versión de PG estás tú? – Kuberchaun

Respuesta

84

necesita recuperar los nombres de las tablas mediante la ejecución de la siguiente consulta:

SELECT * 
FROM information_schema.constraint_table_usage 
WHERE table_name = 'your_table' 

Alternativamente, puede utilizar pg_constraint para recuperar esta información

select n.nspname as schema_name, 
     t.relname as table_name, 
     c.conname as constraint_name 
from pg_constraint c 
    join pg_class t on c.conrelid = t.oid 
    join pg_namespace n on t.relnamespace = n.oid 
where t.relname = 'your_table_name'; 

continuación, puede ejecutar la sentencia ALTER TABLE requerido:

ALTER TABLE your_table DROP CONSTRAINT constraint_name; 

Por supuesto se puede realizar la consulta devuelve la instrucción ALTER completa:

SELECT 'ALTER TABLE '||table_name||' DROP CONSTRAINT '||constraint_name||';' 
FROM information_schema.constraint_table_usage 
WHERE table_name in ('your_table', 'other_table') 

No se olvide de incluir el esquema_tabla en la cláusula WHERE (y la instrucción ALTER) si hay varios esquemas con las mismas tablas.

8

Si tiene 9.x de PG, puede utilizar la instrucción DO para ejecutar esto. Solo haz lo que a_horse_with_no_name hizo, pero aplícalo a una declaración DO.

DO $$DECLARE r record; 
    BEGIN 
     FOR r IN SELECT table_name,constraint_name 
       FROM information_schema.constraint_table_usage 
       WHERE table_name IN ('your_table', 'other_table') 
     LOOP 
      EXECUTE 'ALTER TABLE ' || quote_ident(r.table_name)|| ' DROP CONSTRAINT '|| quote_ident(r.constraint_name) || ';'; 
     END LOOP; 
    END$$; 
+0

+1, buena idea usar la declaración DO si es posible –

Cuestiones relacionadas