我正在尝试使用"DROP TABLE"
命令删除一些表但由于未知原因,该程序只是“坐着”并且不会删除我希望它在数据库中的表。
我在数据库中有3个表:
产品,账单和账单_产品,用于参考账单中的产品。
我设法删除/删除了产品,但我不能对bill和Bill_Products做同样的事情。
我正在发出相同的"DROP TABLE Bill CASCADE;"
命令,但命令行只是暂停。我还使用了没有CASCADE
选项的简单版本。
你知道为什么会这样吗?
更新
我一直在想数据库可以保留从产品到账单的一些引用,也许这就是为什么它不会删除Bill表。
所以,就此而言,我发出了一个简单的SELECT * from Bill_Products
并且在几(10-15)秒之后(奇怪的是,因为我认为它持续这么长时间是空的并不正常table)它打印出表格及其内容,没有。 (所以 显然 从产品到比尔没有任何参考)。
答案 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';
然后按
杀死每一个pidkill 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);
答案 6 :(得分:1)
老问题但遇到了类似的问题。无法重启数据库,所以测试了一些事情,直到这个序列工作: