Postgresql DROP TABLE不起作用

Rad*_*hiu 27 python database django postgresql

我试图用"DROP TABLE"命令删除几个表但由于一个未知的原因,该程序只是"坐"并且不删除我想要它在数据库中的表.

我在数据库中有3个表:

产品,账单和账单_产品,用于参考账单中的产品.

我设法删除/删除产品,但我不能对bill和Bill_Products做同样的事情.我发出相同的"DROP TABLE Bill CASCADE;"命令,但命令行只是停止.我也使用了没有CASCADE选项的简单版本.

你知道为什么会这样吗?

更新:

我一直在想数据库可以保留从产品到账单的一些参考,也许这就是为什么它不会删除Bill表.

所以,就此而言,我发布了一个简单的SELECT * from Bill_Products,经过几十(10-15)秒(奇怪的是,因为我不认为它持续这么长时间,当有一个空表是正常的)它打印出表和它的内容,没有.(显然,从产品到比尔没有任何参考).

vye*_*rov 42

什么是输出

SELECT *
  FROM pg_locks l
  JOIN pg_class t ON l.relation = t.oid AND t.relkind = 'r'
 WHERE t.relname = 'Bill';
Run Code Online (Sandbox Code Playgroud)

可能是并行使用您的表的其他会话,您无法获取Access Exclusive锁以删除它.

  • 谢谢,但我设法通过简单的重启修复它.这是一种愚蠢而不是神秘的事情,我做了什么,但这是解决问题的最短路径.我投了你的答案,所以你知道我感谢你的帮助.我猜的确有一个交易锁定了表格. (2认同)
  • 是的,我确实设法通过简单地重新启动postgresql然后删除表来解决这个问题. (2认同)

Fan*_*ohn 14

做就是了

SELECT pid, relname
FROM pg_locks l
JOIN pg_class t ON l.relation = t.oid AND t.relkind = 'r'
WHERE t.relname = 'Bill';
Run Code Online (Sandbox Code Playgroud)

然后杀死每一个pid

kill 1234
Run Code Online (Sandbox Code Playgroud)

其中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
Run Code Online (Sandbox Code Playgroud)


rad*_*and 7

我今天遇到了这个问题,我发布了一个:

DROP TABLE TableNameHere

并得到ERROR: table "tablenamehere" does not exist. 我意识到对于区分大小写的表(就像我的一样),您需要引用表名称:

DROP TABLE "TableNameHere"


Tho*_*ena 6

所以我试着解决同样的问题几个小时就撞到了墙上,这是解决方案对我有用:

检查PostgreSQL是否有一个从未提交或回滚的待处理准备事务:

SELECT database, gid FROM pg_prepared_xacts;
Run Code Online (Sandbox Code Playgroud)

如果得到结果,那么对于每个事务gid,您必须从有问题的数据库中执行ROLLBACK:

ROLLBACK PREPARED 'the_gid';
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请单击此处.


小智 5

有同样的问题。

桌子上没有任何锁。

重新启动有帮助。

  • 对我来说也是一样。我不必重新启动,只需重新启动 postgresql。 (2认同)

gre*_*pit 5

如果这是针对 AWS postgres 运行第一个语句以获取 PID(进程 ID),然后运行第二个查询以终止进程(这与执行 kill -9 非常相似,但由于这是在云中,这是 AWS 推荐的)

-- gets you the PID
SELECT pid, relname FROM pg_locks l JOIN pg_class t ON l.relation = t.oid AND t.relkind = 'r' WHERE t.relname = 'YOUR_TABLE_NAME'

-- what actually kills the PID ...it is select statement but it kills the job!
SELECT pg_terminate_backend(YOUR_PID_FROM_PREVIOUS_QUERY);
Run Code Online (Sandbox Code Playgroud)

来源