不能从 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
,以便服务器关闭打开时间过长的事务。
我尝试使用此命令从 "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
,以便服务器关闭打开时间过长的事务。