Rad*_*hiu 27 python database django postgresql
我试图用"DROP TABLE"命令删除几个表但由于一个未知的原因,该程序只是"坐"并且不删除我想要它在数据库中的表.
我在数据库中有3个表:
产品,账单和账单_产品,用于参考账单中的产品.
我设法删除/删除产品,但我不能对bill和Bill_Products做同样的事情.我发出相同的"DROP TABLE Bill CASCADE;"命令,但命令行只是停止.我也使用了没有CASCADE选项的简单版本.
你知道为什么会这样吗?
更新:
我一直在想数据库可以保留从产品到账单的一些参考,也许这就是为什么它不会删除Bill表.
所以,就此而言,我发布了一个简单的SELECT * from Bill_Products,经过几十(10-15)秒(奇怪的是,因为我不认为它持续这么长时间,当有一个空表是正常的)它打印出表和它的内容,没有.(显然,从产品到比尔没有任何参考).
vye*_*rov 42
什么是输出
SELECT *
FROM pg_locks l
JOIN pg_class t ON l.relation = t.oid AND t.relkind = 'r'
WHERE t.relname = 'Bill';
Run Code Online (Sandbox Code Playgroud)
可能是并行使用您的表的其他会话,您无法获取Access Exclusive锁以删除它.
Fan*_*ohn 14
做就是了
SELECT pid, relname
FROM pg_locks l
JOIN pg_class t ON l.relation = t.oid AND t.relkind = 'r'
WHERE t.relname = 'Bill';
Run Code Online (Sandbox Code Playgroud)
然后杀死每一个pid
kill 1234
Run Code Online (Sandbox Code Playgroud)
其中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
Run Code Online (Sandbox Code Playgroud)
我今天遇到了这个问题,我发布了一个:
DROP TABLE TableNameHere
并得到ERROR: table "tablenamehere" does not exist. 我意识到对于区分大小写的表(就像我的一样),您需要引用表名称:
DROP TABLE "TableNameHere"
所以我试着解决同样的问题几个小时就撞到了墙上,这是解决方案对我有用:
检查PostgreSQL是否有一个从未提交或回滚的待处理准备事务:
SELECT database, gid FROM pg_prepared_xacts;
Run Code Online (Sandbox Code Playgroud)
如果得到结果,那么对于每个事务gid,您必须从有问题的数据库中执行ROLLBACK:
ROLLBACK PREPARED 'the_gid';
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请单击此处.
如果这是针对 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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32695 次 |
| 最近记录: |