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:
- Pourquoi la séquence reste liée avec l'ancienne table?
- 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)
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. –
Je ne sais pas comment formater correctement une instruction SQL dans les commentaires, alors j'ai ajouté l'instruction à ma réponse –