18 Stimmen

Löschen einer Tabelle in PostgreSQL, ohne eine zugehörige Sequenz zu löschen

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:

  1. Warum ist die Sequenz noch verknüpft? mit der alten Tabelle verknüpft?
  2. 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)

32voto

a_horse_with_no_name Punkte 489934

Versuchen Sie dies:

ALTER SEQUENCE foo\_id\_seq OWNED BY NONE

dann sollten Sie in der Lage sein, die Tabelle zu löschen.

Um den "Besitzer" einer Sequenz abzufragen, verwenden Sie die folgende Abfrage

SELECT s.relname as sequence\_name,  
       n.nspname as sequence\_schema,  
       t.relname as related\_table, 
       a.attname as related\_column 
  FROM pg\_class s, pg\_depend d, pg\_class t, pg\_attribute a, pg\_namespace n 
  WHERE s.relkind     = 'S' 
    AND n.oid         = s.relnamespace 
    AND d.objid       = s.oid 
    AND d.refobjid    = t.oid 
    AND (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X