Postgresql DROP TABLE不起作用

时间:2012-04-25 13:50:04

标签: python database django postgresql

我正在尝试使用"DROP TABLE"命令删除一些表但由于未知原因,该程序只是“坐着”并且不会删除我希望它在数据库中的表。

我在数据库中有3个表:

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

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

你知道为什么会这样吗?

更新

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

所以,就此而言,我发出了一个简单的SELECT * from Bill_Products并且在几(10-15)秒之后(奇怪的是,因为我认为它持续这么长时间是空的并不正常table)它打印出表格及其内容,没有。 (所以 显然 从产品到比尔没有任何参考)。

7 个答案:

答案 0 :(得分:35)

的输出是什么
SELECT *
  FROM pg_locks l
  JOIN pg_class t ON l.relation = t.oid AND t.relkind = 'r'
 WHERE t.relname = 'Bill';

可能会有其他会话并行使用您的表格而您无法获取Access Exclusive锁定以放弃它。

答案 1 :(得分:11)

只做

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

答案 2 :(得分:6)

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

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

SELECT database, gid FROM pg_prepared_xacts;

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

ROLLBACK PREPARED 'the_gid';

有关详细信息,请click here

答案 3 :(得分:4)

有同样的问题。

桌子上没有锁。

重新启动帮助。

答案 4 :(得分:3)

我今天遇到这个问题,我是在发出:

DROP TABLE TableNameHere

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

DROP TABLE "TableNameHere"

答案 5 :(得分:2)

如果这是针对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);

source

答案 6 :(得分:1)

老问题但遇到了类似的问题。无法重启数据库,所以测试了一些事情,直到这个序列工作:

  • truncate table foo;
  • 同时删除索引foo_something;倍4-5倍
  • alter table foo drop column whatever_foreign_key;倍3倍
  • alter table foo drop column id;
  • drop table foo;