Problema
Supongamos disponer de dos tablas, foo
y foo_old
, cada una con una columna llamada "id"
.
Supongamos también que ambas tablas tengan el siguiente esquema:
id integer NOT NULL DEFAULT nextval('foo_id_seq'::regclass)
y que queremos realizar un DROP de la tabla foo_old
:
test=# DROP TABLE foo_old;
ERROR: cannot drop table foo_old because other objects depend on it
DETAIL: default for table foo column id depends on sequence foo_id_seq
HINT: Use DROP ... CASCADE to drop the dependent objects too.
Puesto que no queremos eliminar la secuencia, debido a que la otra tabla, foo
, depende de ella, CASCADE
no es una opción.
Solución
El problema, en este caso, es que la secuencia contiene una dependencia con la otra tabla / columna.
Es posible comprobar a quien pertenece la secuencia con el metacomando \d+
de psql
:
test=*# \d+ foo_id_seq
Sequence "public.foo_id_seq"
Type | Start | Minimum | Maximum | Increment | Cycles? | Cache
--------+-------+---------+---------------------+-----------+---------+-------
bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1
Owned by: public.foo_old.id
test=*#
La secuencia puede ser modificada para que sea propiedad de la otra tabla:
test=*# ALTER SEQUENCE public.foo_id_seq OWNED BY public.foo.id;
ALTER SEQUENCE
A continuación, volvemos a comprobar la secuencia:
test=*# \d+ foo_id_seq
Sequence "public.foo_id_seq"
Type | Start | Minimum | Maximum | Increment | Cycles? | Cache
--------+-------+---------+---------------------+-----------+---------+-------
bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1
Owned by: public.foo.id
Ahora es posible realizar el DROP
de la tabla foo_old
:
test=*# DROP TABLE foo_old;
DROP TABLE
test=*#
Causa del problema
La secuencia depende de una columna de la tabla que se quiere eliminar.