web-dev-qa-db-ja.com

Postgresql DROP TABLEが機能しない

"DROP TABLE"コマンドを使用していくつかのテーブルを削除しようとしていますが、不明な理由により、プログラムは「座って」、データベース内の必要なテーブルを削除しません。

データベースに3つのテーブルがあります。

請求書で製品を参照するために使用されるProduct、BillおよびBill_Products。

なんとか製品を削除/ドロップできましたが、billとBill_Productsに対して同じことはできません。同じ"DROP TABLE Bill CASCADE;"コマンドを発行していますが、コマンドラインが停止しています。 CASCADEオプションなしのシンプルバージョンも使用しました。

これがなぜ起こっているのかあなたは何か考えがありますか?

更新:

データベースが製品から請求書へのいくつかの参照を保持することは可能であると私は考えていました。それがおそらくそれがBillテーブルを削除しない理由です。

そのため、私は単純なSELECT * from Bill_Productsを発行し、数秒後(奇妙なことに、空のテーブルがあると、このように長時間続くのは普通ではないと思うので)表とその内容を印刷しましたが、どれもありません。 (そう どうやら ProductsからBillへの参照は残っていません)。

29
Radu Gheorghiu

の出力は何ですか

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

テーブルを並行して使用している他のセッションがあり、 Access Exclusive ロックを取得して削除できない場合があります。

39
vyegorov

するだけ

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

そして、すべてのpidを殺す

kill 1234

1234はクエリ結果の実際のPIDです。

次のようにすべて一緒にパイプできます(したがって、すべてのPIDを手動でコピーして貼り付ける必要はありません)。

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

だから私は同じ問題を解決しようと数時間壁に頭をぶつけていました、そしてここに私のために働いた解決策があります:

PostgreSQLに、コミットまたはロールバックされていない保留中の準備済みトランザクションがあるかどうかを確認します。

SELECT database, gid FROM pg_prepared_xacts;

結果を取得する場合、各トランザクションgidに対して、[〜#〜]ロールバック[〜 #〜]問題のあるデータベースから:

ROLLBACK PREPARED 'the_gid';

詳細については、 ここをクリック をご覧ください。

同じ問題があった。

テーブルにロックはありませんでした。

再起動が助けた。

4
alekzvik

古い質問ですが、同様の問題が発生しました。データベースを再起動できなかったため、このシーケンスが機能するまでいくつかのテストを行いました:

  • テーブルfooを切り捨てます。
  • インデックスを同時にドロップするfoo_something; 4〜5倍
  • alter table foo drop columnwhatever_foreign_key; 3倍
  • alter table foo drop column id;
  • テーブルfooを削除します。
1
kert

今日これに遭遇しました、私は以下を発行していました:

DROP TABLE TableNameHere

ERROR: table "tablenamehere" does not existを取得します。 (私のように)大文字と小文字を区別するテーブルの場合は、テーブル名を引用符で囲む必要があることに気付きました。

DROP TABLE "TableNameHere"

0
radicand