我嘗試使用此命令從"name"列中洗掉 NOT NULL,但它被驚呆了并且不回傳任何內容。
ALTER TABLE "school_students" ALTER COLUMN "name" DROP NOT NULL;
這是我的"school_students"表結構:

更新 1:
運行查詢select now() - query_start, pid, query from pg_stat_activity where state != 'idle' order by 1 desc;以檢查是否存在未提交的事務后,結果如下:

請幫忙,謝謝。
uj5u.com熱心網友回復:
唯一可以阻止像這樣的短操作的是沖突鎖。
ALTER TABLE像您正在運行的陳述句這樣的陳述句需要ACCESS EXCLUSIVE對表進行(短)鎖定——您不能在使用表定義時更改它。現在,任何曾經使用過該表的并發事務至少ACCESS SHARE在該表上持有一個鎖,直到事務結束,這將阻塞你的ALTER TABLE.
要找出哪個會話阻止了您,請執行以下操作:
在運行之前
ALTER TABLE,執行SELECT pg_backend_pid();找出您的會話行程號。
運行
ALTER TABLE掛起的。啟動另一個資料庫會話并運行
SELECT pg_blocking_pids(12345);其中 12345 是上述查詢的結果。現在您知道哪些會話阻止了您。
關閉阻塞事務并重試。要強制結束掛起的交易,您可以使用
SELECT pg_cancel_backend(23456);其中 23456 是在前面的陳述句中找到的行程號。
您應該修復應用程式中保持交易打開的所有錯誤。這始終是一個錯誤。如果您沒有更好的方法,請設定資料庫引數idle_in_transaction_session_timeout,以便保持打開時間過長的事務被服務器關閉。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/415487.html
標籤:
