42

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

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

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

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

なぜこれが起こっているのか分かりますか?

アップデート:

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

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

4

8 に答える 8

64

の出力は何ですか

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

テーブルを並行して使用している他のセッションがあり、それを削除するためのアクセス排他ロックを取得できない可能性があります。

于 2012-04-25T14:04:33.590 に答える
22

やるだけ

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
于 2015-10-29T13:32:53.010 に答える
10

そのため、同じ問題を解決しようとして数時間壁に頭をぶつけていましたが、これが私にとってうまくいった解決策です。

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

SELECT database, gid FROM pg_prepared_xacts;

結果が得られた場合は、トランザクションgidごとに、問題のあるデータベースからROLLBACKを実行する必要があります。

ROLLBACK PREPARED 'the_gid';

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

于 2013-12-30T00:57:50.640 に答える