Postgresql DROP TABLE 不起作用

Posted

技术标签:

【中文标题】Postgresql DROP TABLE 不起作用【英文标题】:Postgresql DROP TABLE doesn't work 【发布时间】:2012-05-06 05:21:29 【问题描述】:

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

我在数据库中有 3 个表:

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

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

你知道为什么会这样吗?

更新:

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

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

【问题讨论】:

不做 CASCADE 怎么办。也许约束是指现在缺少的产品 也试过了,但没有效果。 "命令行停止了"这是什么意思? psql 崩溃、挂起或冻结?你必须杀了它吗? Ctrl-C 有什么作用?我想我只是说定义'摊位'。还是你没有使用 psql? 也许另一个事务在表上有一个锁,所以你不能删除它? 重启只适用于名为“Bill”的表;-) 【参考方案1】:

输出是什么

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

可能有其他会话并行使用您的表,您无法获得Access Exclusive 锁定来删除它。

【讨论】:

psdemo=> SELECT * from pg_locks l join pg_class t on l.relation = t.oid AND t.relkind = 'r' WHERE t.relname="ps_bill"; ERROR: column "ps_bill" does not exist LINE 1: ...ation = t.oid AND t.relkind = 'r' WHERE t.relname="ps_bill"; 对于文字值,使用单引号(撇号)。 PostgreSQL 在将双引号视为包装 标识符 方面符合 SQL 标准。 谢谢,但我设法通过简单的重新启动来修复它。我所做的这有点愚蠢而不是揭开神秘面纱,但这是解决问题的最短途径。我对你的答案投了赞成票,所以你知道我感谢你的帮助。我想确实有一个事务在表上持有锁。 是的,我确实设法通过简单地重新启动 postgresql 然后删除表来解决这个问题。【参考方案2】:

遇到同样的问题。

桌子上没有任何锁。

重启有帮助。

【讨论】:

对我来说也一样。我不必重新启动,只需要重新启动 postgresql。【参考方案3】:

因此,我花了几个小时试图解决同样的问题,但这是对我有用的解决方案:

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

SELECT database, gid FROM pg_prepared_xacts;

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

ROLLBACK PREPARED 'the_gid';

欲了解更多信息,click here。

【讨论】:

【参考方案4】:

做事

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

【讨论】:

即使我发布问题已经超过 3 年了,我还是要感谢您的到来并分享您的解决方案。但是,我的问题是 relname 会是什么? @RaduGheorghiu relname 实际上是一个表名。【参考方案5】:

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

截断表 foo; 同时删除索引 foo_something; 4-5 倍 更改表 foo 删除列whatever_foreign_key; 3 倍 alter table foo drop column id; 删除表 foo;

【讨论】:

【参考方案6】:

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

DROP TABLE TableNameHere

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

DROP TABLE "TableNameHere"

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

【讨论】:

以上是关于Postgresql DROP TABLE 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

postgresql如何禁止在数据库执行drop table操作

DROP TABLE 在 sqlite 中不起作用

在 PostgreSQL 中创建/删除索引的用户权限

使用dwr后,javaweb设置的session超时失效,web.xml和tomcat设置都不起作

Postgresql 复合唯一键(LastName、FirstName、MiddleName)不起作用?

在 PostgreSQL 中授予对函数 pg_start_backup 的执行不起作用