Ответ 1
Просто поставьте DROP TABLE IF EXISTS `tablename`;
перед оператором CREATE TABLE
.
Этот оператор отбрасывает таблицу, если она существует, но не будет выдавать ошибку, если это не так.
Я в тупике, я не знаю, как это сделать.
В принципе, я просто хочу создать таблицу, но если она существует, ее нужно удалить и повторно создать, а не усекать, но если она не существует, просто создайте ее.
Может ли кто-нибудь помочь?
Спасибо, Джордж
Просто поставьте DROP TABLE IF EXISTS `tablename`;
перед оператором CREATE TABLE
.
Этот оператор отбрасывает таблицу, если она существует, но не будет выдавать ошибку, если это не так.
Просто используйте DROP TABLE IF EXISTS
:
DROP TABLE IF EXISTS `foo`;
CREATE TABLE `foo` ( ... );
Сначала попробуйте выполнить поиск документации MySQL, если у вас есть другие проблемы.
Ну что ж... В течение многих лет никто не упоминал одну тонкую вещь.
Несмотря на DROP TABLE IF EXISTS 'bla'; CREATE TABLE 'bla' (... );
DROP TABLE IF EXISTS 'bla'; CREATE TABLE 'bla' (... );
кажется разумным, это приводит к ситуации, когда старая таблица уже исчезла, а новая еще не создана: какой-то клиент может попытаться получить доступ к предметной таблице прямо сейчас.
Лучше всего создать новую таблицу и заменить ее старой (содержимое таблицы теряется):
CREATE TABLE 'bla__new' (id int); /* if not ok: terminate, report error */
RENAME TABLE 'bla__new' to 'bla'; /* if ok: terminate, report success */
RENAME TABLE 'bla' to 'bla__old', 'bla__new' to 'bla';
DROP TABLE IF EXISTS 'bla__old';
CREATE...
и не продолжать в случае ошибки, потому что сбой означает, что другой поток не завершил тот же сценарий: либо потому, что он потерпел крах в середине, либо просто еще не завершил - он хорошая идея, чтобы проверить вещи самостоятельно.RENAME...
и не продолжать в случае успеха: вся операция успешно завершена; Более того, запуск следующего RENAME...
может (и будет) быть небезопасным, если другой поток уже запустил ту же последовательность (лучше охватить этот случай, чем не закрывать, см. примечание по блокировке ниже).RENAME...
атомарно заменяет определение таблицы, подробности см. В руководстве MySQL.DROP...
просто очищает старый стол, очевидно. Оборачивание всех операторов чем-то вроде SELECT GET_LOCK('__upgrade', -1);... DO RELEASE_LOCK('__upgrade');
SELECT GET_LOCK('__upgrade', -1);... DO RELEASE_LOCK('__upgrade');
позволяет просто вызывать все операторы последовательно без проверки ошибок, но я не думаю, что это хорошая идея: повышается сложность, а функции блокировки в MySQL не безопасны для репликации на основе операторов.
Если данные таблицы должны выжить при обновлении определения таблицы... В общем случае это гораздо более сложная история о сравнении определений таблицы для выявления различий и создания правильного оператора ALTER...
, что не всегда возможно автоматически, например, при переименовании столбцов.
Мне нужно было отбросить таблицу и заново создать данные из представления. Я создавал таблицу из вида, и вот что я сделал:
DROP TABLE <table_name>;
CREATE TABLE <table_name> AS SELECT * FROM <view>;
Вышеупомянутое работало для меня, используя MySQL MariaDb.