superuser - Eliminar restricción por nombre en Postgresql
postgresql role password (2)
¿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.
Debe recuperar los nombres de la tabla ejecutando la siguiente consulta:
SELECT *
FROM information_schema.constraint_table_usage
WHERE table_name = ''your_table''
Alternativamente, puede usar 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'';
Luego puede ejecutar la instrucción ALTER TABLE requerida:
ALTER TABLE your_table DROP CONSTRAINT constraint_name;
Por supuesto, puede hacer que la consulta devuelva la declaración alternativa 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 table_schema en la cláusula WHERE (y la instrucción ALTER) si hay múltiples esquemas con las mismas tablas.
Si tiene 9.x de PG, puede hacer uso de la declaració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$$;