with superuser postgres password new create cannot postgresql

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