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).
Ответы
Ответ 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;