2010-12-01 6 views
9

J'ai une table, foo. Aux fins d'une mise à niveau rapide/déploiement de mon site, j'ai fait une nouvelle table, tmp_foo, contenir de nouvelles données, en faisant:Suppression d'une table dans PostgreSQL sans suppression d'une séquence associée

create table tmp_foo (like foo including constraints including defaults including indexes); 

Maintenant, chaque table a une colonne PK id qui ressemble à:

Column |   Type   |        Modifiers         
-------------+-----------------------+-------------------------------------------------------------------------- 
id   | integer    | not null default nextval('foo_id_seq'::regclass) 

Le point important est que les deux tables reposent sur la même séquence exacte, foo_id_seq. Il n'y a pas de tmp_foo_id_seq. Cela semble OK pour mes fins.

Après cela, je chargé tmp_foo avec de nouvelles données et retitré les tables afin que tmp_foo a repris comme le vrai foo et le foo d'origine est devenu foo_old. Maintenant, j'essaie de laisser tomber 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 

assez juste, la valeur par défaut de la colonne id dépend toujours de la séquence.

db=> alter table foo_old alter column id drop default; 

Voici le kicker.

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 

Alors foo_old n'a plus aucune dépendance visible sur la séquence, mais il essaie toujours de laisser tomber la séquence avec la table (et, évidemment, ne sera pas parce que la nouvelle table en dépend).

La question est en deux parties:

  1. Pourquoi la séquence reste liée avec l'ancienne table?
  2. Y at-il moyen de contourner ce qui n'implique pas faire la nouvelle table dépendent d'une séquence nouvelle ou différente (si ce aide serait même)?

(sur PostgreSQL 8.4)

Répondre

19

Essayez ceci:

 
ALTER SEQUENCE foo_id_seq OWNED BY NONE 

alors vous devriez être en mesure de déposer la table.

Pour récupérer le "propriétaire" d'une séquence, utilisez la requête suivante

 
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) 
+1

Aha. Ça a marché. (En fait, depuis que j'étais paranoïaque, j'ai fait de la nouvelle table le propriétaire, plutôt que rien.) Savez-vous comment inspecter le propriétaire d'une séquence? '\ d' ne l'affiche pas et' select * from foo_id_seq' non plus. –

+0

Je ne sais pas comment formater correctement une instruction SQL dans les commentaires, alors j'ai ajouté l'instruction à ma réponse –

Questions connexes