web-dev-qa-db-fra.com

Postgresql DROP TABLE ne fonctionne pas

J'essaie de supprimer quelques tables avec le "DROP TABLE" commande mais pour une raison inconnue, le programme "s'assoit" et ne supprime pas la table que je veux dans la base de données.

J'ai 3 tables dans la base de données:

Product, Bill et Bill_Products qui est utilisé pour référencer les produits dans les factures.

J'ai réussi à supprimer/déposer un produit, mais je ne peux pas faire de même pour Bill et Bill_Products. J'émets le même "DROP TABLE Bill CASCADE;" commande mais la ligne de commande se bloque simplement. J'ai également utilisé la version simple sans l'option CASCADE.

Savez-vous pourquoi cela se produit?

Mettre à jour:

J'ai pensé qu'il était possible pour les bases de données de conserver certaines références des produits aux factures et c'est peut-être pourquoi cela ne supprimera pas la table Bill.

Donc, d'ailleurs, j'ai publié un simple SELECT * from Bill_Products et après quelques (10-15) secondes (étrangement, parce que je ne pense pas qu'il soit normal que cela dure si longtemps quand il y a une table vide), il a imprimé la table et son contenu, qui n'en sont pas. (alors apparemment il ne reste aucune référence des Produits à Bill).

29
Radu Gheorghiu

Quelle est la sortie de

SELECT *
  FROM pg_locks l
  JOIN pg_class t ON l.relation = t.oid AND t.relkind = 'r'
 WHERE t.relname = 'Bill';

Il se peut que d'autres sessions utilisent votre table en parallèle et que vous ne puissiez pas obtenir Access Exclusive lock pour la supprimer.

39
vyegorov

Fais juste

SELECT pid, relname
FROM pg_locks l
JOIN pg_class t ON l.relation = t.oid AND t.relkind = 'r'
WHERE t.relname = 'Bill';

Et puis tuez chaque pid par

kill 1234

Où 1234 est votre pid réel des résultats de la requête.

Vous pouvez tout diriger comme ceci (vous n'avez donc pas besoin de copier-coller chaque pid manuellement):

psql -c "SELECT pid FROM pg_locks l 
    JOIN pg_class t ON l.relation = t.oid AND t.relkind = 'r' 
    WHERE t.relname = 'Bill';" | tail -n +3 | head -n -2 | xargs kill
12
Fancy John

Alors je me suis cogné la tête contre le mur pendant quelques heures en essayant de résoudre le même problème, et voici la solution qui a fonctionné pour moi:

Vérifiez si PostgreSQL a une transaction préparée en attente qui n'a jamais été validée ou annulée:

SELECT database, gid FROM pg_prepared_xacts;

Si vous obtenez un résultat, alors pour chaque transaction gid vous devez exécuter un [~ # ~] rollback [~ # ~] de la base de données ayant le problème:

ROLLBACK PREPARED 'the_gid';

Pour plus d'informations, cliquez ici .

6

Eu le même problème.

Il n'y avait aucun verrou sur la table.

Le redémarrage a aidé.

4
alekzvik

Vieille question mais a rencontré un problème similaire. Impossible de redémarrer la base de données, donc j'ai testé quelques éléments jusqu'à ce que cette séquence fonctionne:

  • tronquer la table foo;
  • drop index simultanément foo_something; fois 4-5x
  • alter table foo drop column fois 3x
  • modifier la table foo drop id de colonne;
  • drop table foo;
1
kert

Je suis tombé sur cela aujourd'hui, je publiais un:

DROP TABLE TableNameHere

et obtenir ERROR: table "tablenamehere" does not exist. J'ai réalisé que pour les tables sensibles à la casse (comme la mienne), vous devez citer le nom de la table:

DROP TABLE "TableNameHere"

0
radicand