No se puede eliminar una tabla de la que dependen otros objetos

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.