不能从 postgreSQL 命令中删除 NOT NULL

Can't DROP NOT NULL from postgreSQL command

我尝试使用此命令从 "name" 列中删除 NOT NULL,但它被惊呆了,什么都没有 return。

ALTER TABLE "school_students" ALTER COLUMN "name" DROP NOT NULL;

这是我的 "school_students" table 结构:

更新 1:

在 运行 查询 select now() - query_start, pid, query from pg_stat_activity where state != 'idle' order by 1 desc; 之后检查是否存在未提交的事务,结果如下:

请帮忙,谢谢。

唯一可以阻止像这样的短操作的是冲突锁。

像你这样的 ALTER TABLE 语句 运行ning 需要对 table 进行(短)ACCESS EXCLUSIVE 锁定 – 你不能更改 table 使用时的定义。现在,任何曾经使用过 table 的并发事务在 table 上至少持有一个 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,以便服务器关闭打开时间过长的事务。