Подтвердить что ты не робот

Postgresql DROP TABLE не работает

Я пытаюсь удалить несколько таблиц командой "DROP TABLE", но по неизвестной причине программа просто "сидит" и не удаляет таблицу, в которой я хочу, чтобы она была в базе данных.

У меня есть 3 таблицы в базе данных:

Продукт, Bill и Bill_Products, который используется для ссылок на продукты в счетах.

Мне удалось удалить/удалить Product, но я не могу сделать то же самое для bill и Bill_Products. Я выдаю ту же команду "DROP TABLE Bill CASCADE;", но командная строка просто кивает. Я также использовал простую версию без опции CASCADE.

У вас есть идея, почему это происходит?

Update:

Я думал, что базы данных могут содержать некоторые ссылки от продуктов на счета и, возможно, на то, почему она не удалит таблицу Билла.

Итак, в этом отношении я выпустил простую SELECT * from Bill_Products и через несколько (10-15) секунд (как ни странно, потому что я не думаю, что для нее так долго будет длиться такое долгое время, когда есть пустая таблица) он распечатывал таблицу и ее содержимое, а это не было. (поэтому очевидно нет ссылок, оставшихся от Products to Bill).

4b9b3361

Ответ 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 блокировку, чтобы ее удалить.

Ответ 2

Итак, я несколько часов ударяю головой о стену, пытаясь решить ту же проблему, и вот решение, которое сработало для меня:

Убедитесь, что PostgreSQL имеет ожидающую подготовленную транзакцию, которая никогда не была выполнена или откатна:

SELECT database, gid FROM pg_prepared_xacts;

Если вы получите результат, то для каждой транзакции gid вы должны выполнить ROLLBACK из базы данных, имеющей проблему:

ROLLBACK PREPARED 'the_gid';

Для получения дополнительной информации нажмите здесь.

Ответ 3

Имела ту же проблему.

В таблице не было никаких блокировок.

Перезагрузка помогла.

Ответ 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

Ответ 5

Старый вопрос, но столкнулся с аналогичной проблемой. Не удалось перезагрузить базу данных, чтобы протестировать несколько вещей, пока эта последовательность не сработала:

  • обрезать таблицу foo;
  • падение индекса одновременно foo_something; раз 4-5x
  • изменить таблицу foo drop column what_foreign_key; раз 3x
  • alter table foo drop column id;
  • drop table foo;