42

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

我在数据库中有 3 个表:

Product、Bill 和 Bill_Products,用于在 bills 中引用产品。

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

你知道为什么会这样吗?

更新:

我一直认为数据库有可能保留从产品到账单的一些引用,也许这就是它不会删除 Bill 表的原因。

所以,就此而言,我发布了一个简单的SELECT * from Bill_Products,并在几(10-15)秒后(奇怪的是,因为我认为当有一张空桌子时它持续这么长时间是不正常的)它打印出表格并它的内容,没有。(所以显然没有从 Products 到 Bill 的参考资料)。

4

8 回答 8

64

什么是输出

SELECT *
  FROM pg_locks l
  JOIN pg_class t ON l.relation = t.oid AND t.relkind = 'r'
 WHERE t.relname = 'Bill';

可能有其他会话并行使用您的表,您无法获得访问独占锁来删除它。

于 2012-04-25T14:04:33.590 回答
22

做就是了

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
于 2015-10-29T13:32:53.010 回答
10

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

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

SELECT database, gid FROM pg_prepared_xacts;

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

ROLLBACK PREPARED 'the_gid';

如需更多信息,请单击此处

于 2013-12-30T00:57:50.640 回答
6

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

来源

于 2020-06-11T19:17:29.203 回答
5

有同样的问题。

桌子上没有任何锁。

重启有帮助。

于 2013-09-28T22:52:09.063 回答
4

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

DROP TABLE TableNameHere

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

DROP TABLE "TableNameHere"

于 2020-02-23T23:12:53.777 回答
2

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

  • 截断表 foo;
  • 同时删除索引 foo_something; 4-5 倍
  • 更改表 foo 删除列whatever_foreign_key;3倍
  • alter table foo drop column id;
  • 删除表 foo;
于 2016-11-22T19:01:25.240 回答
0

同样的事情也发生在我身上——只是因为我忘记了分号。掌心

于 2021-10-01T23:40:33.380 回答