Estuve algunos días dando vuelta para poder eliminar un grupo de tablas exceptuando solo un grupo en especifico, un grupo muy pequeño de hecho. Conseguí mucha información pero nada lo suficientemente acertado ni practico para aplicarlo así que con esas gotas que fui consiguiendo construí esto
<
DO
$$
DECLARE
v_table VARCHAR;
v_sql_string VARCHAR;
v_exclude_table VARCHAR[] := ARRAY['field1', 'field2', 'field3'];
v_i INTEGER;
v_num INTEGER;
BEGIN
SELECT INTO v_num count(relname)
FROM pg_class c
JOIN pg_namespace nsp ON c.relnamespace = nsp.oid
WHERE c.relname <> ALL(v_exclude_table)
AND nsp.nspname = 'public'
AND relhasindex = 't';
FOR v_i IN 1..v_num
LOOP
SELECT c.relname
INTO v_table
FROM (
SELECT pg_constraint.confrelid, COUNT(confrelid) as total FROM pg_constraint, pg_class WHERE
pg_class.oid = pg_constraint.conindid
GROUP BY pg_constraint.confrelid
) AS rest
RIGHT JOIN pg_class c ON rest.confrelid = c.oid
JOIN pg_namespace nsp ON c.relnamespace = nsp.oid
WHERE c.relname <> ALL(v_exclude_table)
AND nsp.nspname = 'public'
AND relhasindex = 't'
ORDER BY
CASE WHEN rest.total IS NULL THEN 0 END, rest.total LIMIT 1;
IF EXISTS(SELECT 1 FROM pg_class c
JOIN pg_namespace nsp ON c.relnamespace = nsp.oid
WHERE c.relname <> ALL(v_exclude_table)
AND nsp.nspname = 'public'
AND relhasindex = 't' ORDER BY c.oid desc LIMIT 1) THEN
v_sql_string := 'DROP TABLE ' || v_table;
EXECUTE v_sql_string;
RAISE NOTICE 'Table %s Deleted',v_table;
ELSE
RAISE NOTICE 'Table %s Not Deleted',v_table;
END IF;
END LOOP;
END
$$
>
Estos script SQL me permitieron buscar las tablas del esquema que me interesaba y organizarla de tal forma que las restricciones no interrumpieran su eliminación.
/*
SELECT relname
FROM pg_class c
JOIN pg_namespace nsp ON c.relnamespace = nsp.oid
WHERE c.relname <> ALL(ARRAY['field1', 'field2', 'field3'])
AND nsp.nspname = 'public'
AND relhasindex = 't';
SELECT c.relname, rest.total, c.oid
FROM (
SELECT pg_constraint.confrelid, COUNT(confrelid) as total FROM pg_constraint, pg_class WHERE
pg_class.oid = pg_constraint.conindid
GROUP BY pg_constraint.confrelid
) AS rest
RIGHT JOIN pg_class c ON rest.confrelid = c.oid
JOIN pg_namespace nsp ON c.relnamespace = nsp.oid
WHERE c.relname <> ALL(ARRAY['field1', 'field2', 'field3'])
AND nsp.nspname = 'public'
AND relhasindex = 't'
ORDER BY
CASE WHEN rest.total IS NULL THEN 0 END,
rest.total;
*/
Entre tanto buscar perdí muchas de las referencias...
https://stackoverflow.com/questions/29913856/how-to-drop-a-table-based-on-if-condition-in-postgres
https://stackoverflow.com/questions/4326343/mysql-left-join-order-by-null-values-to-the-end
https://stackoverflow.com/questions/4326343/mysql-left-join-order-by-null-values-to-the-end
No hay comentarios:
Publicar un comentario