Postgresql DROP TABLE没有

2024-05-06 15:10:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

数据库中有3个表:

产品、票据和票据产品,用于引用票据中的产品。

我设法删除/删除了产品,但无法对bill和bill_产品执行相同的操作。 我发出了相同的"DROP TABLE Bill CASCADE;"命令,但命令行只是暂停。我还使用了不带CASCADE选项的简单版本。

你知道为什么会这样吗?

更新:

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

所以,对于这个问题,我发布了一个简单的SELECT * from Bill_Products,在几秒钟(奇怪的是,因为我认为当有空表的时候持续这么长时间是不正常的)之后,它打印出了表和它的内容,它们都不是。(因此,显然,产品与账单之间没有任何关系)。


Tags: 命令行命令程序数据库产品table原因票据
3条回答

所以我在墙上撞了几个小时试图解决同样的问题,下面是对我有效的解决方案:

检查PostgreSQL是否有未提交或回滚的挂起准备事务:

SELECT database, gid FROM pg_prepared_xacts;

如果得到结果,则对于每个事务,必须从有问题的数据库中执行一个回滚:

ROLLBACK PREPARED 'the_gid';

有关详细信息,请click here

就这么做

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

然后通过

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

什么是输出

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

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

相关问题 更多 >