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

Если таблица существует, то создайте ее, если она не существует, просто создайте ее

Я в тупике, я не знаю, как это сделать.

В принципе, я просто хочу создать таблицу, но если она существует, ее нужно удалить и повторно создать, а не усекать, но если она не существует, просто создайте ее.

Может ли кто-нибудь помочь?

Спасибо, Джордж

4b9b3361

Ответ 1

Просто поставьте DROP TABLE IF EXISTS `tablename`; перед оператором CREATE TABLE.

Этот оператор отбрасывает таблицу, если она существует, но не будет выдавать ошибку, если это не так.

Ответ 2

Просто используйте DROP TABLE IF EXISTS:

DROP TABLE IF EXISTS `foo`;
CREATE TABLE `foo` ( ... );

Сначала попробуйте выполнить поиск документации MySQL, если у вас есть другие проблемы.

Ответ 3

Ну что ж... В течение многих лет никто не упоминал одну тонкую вещь.

Несмотря на 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..., что не всегда возможно автоматически, например, при переименовании столбцов.

Ответ 4

Мне нужно было отбросить таблицу и заново создать данные из представления. Я создавал таблицу из вида, и вот что я сделал:

DROP TABLE <table_name>;
CREATE TABLE <table_name> AS SELECT * FROM <view>;

Вышеупомянутое работало для меня, используя MySQL MariaDb.