Ich habe einen Tisch, foo
. Für die Zwecke eines schnellen Upgrades/Deployments meiner Website habe ich eine neue Tabelle erstellt, tmp_foo
, um einige neue Daten zu enthalten:
create table tmp_foo (like foo including constraints including defaults including indexes);
Jetzt hat jede Tabelle eine PK id
Spalte, die wie folgt aussieht:
Column | Type | Modifiers
-------------+-----------------------+--------------------------------------------------------------------------
id | integer | not null default nextval('foo_id_seq'::regclass)
Wichtig ist, dass beide Tabellen auf genau der gleichen Reihenfolge beruhen, foo_id_seq
. Es gibt keine tmp_foo_id_seq
. Das scheint für meine Zwecke in Ordnung zu sein.
Danach lud ich tmp_foo
mit neuen Daten und benannte die Tabellen um, so dass tmp_foo
übernahm die Rolle des eigentlichen foo
und das Original foo
wurde foo_old
. Jetzt versuche ich, die foo_old
:
db=> drop table foo_old ;
ERROR: cannot drop table foo_old because other objects depend on it
DETAIL: default for table foo_old column id depends on sequence foo_id_seq
Nun gut, die id
Spalte Standard hängt noch von der Reihenfolge ab.
db=> alter table foo_old alter column id drop default;
Und jetzt kommt der Clou.
db=> 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
Also foo_old
hat keine sichtbare Abhängigkeit mehr von der Sequenz, versucht aber immer noch, die Sequenz zusammen mit der Tabelle zu löschen (was natürlich nicht gelingt, weil die neue Tabelle von ihr abhängt).
Die Frage ist also zweigeteilt:
- Warum ist die Sequenz noch verknüpft? mit der alten Tabelle verknüpft?
- Gibt es irgendwelche Möglichkeit, dies zu umgehen, ohne dass dass die neue Tabelle von einer neuen oder anderen Sequenz abhängt (wenn diese überhaupt helfen würde)?
(Auf PostgreSQL 8.4)