2012-04-25 20 views
15

Estoy tratando de soltar algunas tablas con el comando "DROP TABLE" pero por una razón desconocida, el programa simplemente "se sienta" y no elimina la tabla que quiero en la base de datos .Postgresql DROP TABLE no funciona

Tengo 3 tablas en la base de datos:

producto, Bill y Bill_Products que se utiliza para hacer referencia a los productos en las facturas.

Logré eliminar/soltar el producto, pero no puedo hacer lo mismo con Bill y Bill_Products. Estoy emitiendo el mismo comando "DROP TABLE Bill CASCADE;" pero la línea de comando simplemente se detiene. También utilicé la versión simple sin la opción CASCADE.

¿Tiene alguna idea de por qué sucede esto?

Actualización:

He estado pensando que es posible que las bases de datos para mantener algunas referencias de productos de facturas y tal vez por eso no va a eliminar la tabla Bill.

Así que, para el caso, emití un simple SELECT * from Bill_Products y después de unos pocos (10-15) segundos (curiosamente, porque no creo que sea normal que dure tanto tiempo cuando hay una tabla vacía) imprimió la tabla y sus contenidos, que no son ninguno. (por lo que aparentemente no hay referencias de Productos a la factura).

+0

¿qué pasa con no hacer la CASCADA. tal vez la restricción se refería al PRODUCTO que faltaba ahora – Randy

+0

Probado sin eso también, pero sin efecto. –

+1

"La línea de comandos se detiene" ¿Qué significa eso? 'psql' se bloquea, se bloquea o se congela? ¿Tienes que matarlo? ¿Qué hace Ctrl-C? Creo que solo digo definir 'puestos'. ¿O no estás usando psql? – alan

Respuesta

26

Cuál es la salida de

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

Podría ser que hay otras sesiones con su tabla en paralelo y no se puede obtener Access Exclusive bloqueo para dejarla caer.

+1

'psdemo => SELECT * from pg_locks l join pg_class t en l.relation = t.oid AND t.relkind = 'r' WHERE t.relname =" ps_bill "; ERROR: la columna "ps_bill" no existe LÍNEA 1: ... ation = t.oid AND t.relkind = 'r' WHERE t.relname = "ps_bill"; ' –

+0

Para un valor literal, utilice comillas simples (el apóstrofo). PostgreSQL cumple con el estándar SQL al tratar las comillas dobles como envolviendo un * identificador *. – kgrittn

+2

Gracias pero logré solucionarlo con un simple reinicio. Es algo tonto y no desmitificador, lo que hice, pero fue la forma más corta de resolver el problema. Elegí tu respuesta para que sepas que aprecio tu ayuda. Supongo que efectivamente hubo una transacción que mantuvo un bloqueo en las mesas. –

4

Tenía el mismo problema.

No hubo cerraduras en la mesa.

Reinicio ayudado.

+0

Lo mismo para mí. No tuve que reiniciar, solo tuve que reiniciar postgresql. –

+0

Lo mismo aquí. Necesito reiniciar – anvd

5

Así que estaba golpeando la cabeza contra la pared durante algunas horas tratando de resolver el mismo problema, y ​​aquí está la solución que funcionó para mí:

Comprobar si PostgreSQL tiene una transacción pendiente preparada que nunca se ha cometido o deshacen:

SELECT database, gid FROM pg_prepared_xacts; 

Si se obtiene un resultado, a continuación, para cada transacción gid debe ejecutar un ROLLBACK de la base de datos que tiene el problema:

ROLLBACK PREPARED 'the_gid'; 

Para obtener más información, click here.

3

Eso sí,

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

Y luego matar a todos los pid por

kill 1234 

Donde 1234 es su real PID de resultados de la consulta.

Puede canalizar todos juntos como esto (por lo que no tiene que copiar y pegar cada PID manualmente):

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 
+0

Incluso si han pasado más de 3 años desde que publiqué la pregunta, quiero agradecerle por venir y compartir su solución. Pero, mi pregunta es ¿qué sería 'relname'? –

+1

@RaduGheorghiu relname es en realidad el nombre de una tabla. – chemikadze

0

pregunta antiguo, pero se encontró con un problema similar. No se pudo reiniciar la base de datos, por lo que se probaron algunas cosas hasta que esta secuencia funcionó:

  • truncate table foo;
  • índice de caída concurrentemente foo_something; veces 4-5x
  • alter table foo drop column whatever_foreign_key; veces 3x
  • alter table foo drop column id;
  • drop table foo;