MySQL - Создать таблицу, Если Она Не существует, Или Обрезать?

StackOverflow https://stackoverflow.com/questions/84330

  •  01-07-2019
  •  | 
  •  

Вопрос

Вот обновленный вопрос:

текущий запрос выполняет что-то вроде:

$sql1 = "TRUNCATE TABLE fubar";
$sql2 = "CREATE TEMPORARY TABLE IF NOT EXISTS fubar SELECT id, name FROM barfu";

При первом запуске метода, содержащего это, он генерирует сообщение об ошибке при усечении, поскольку таблица еще не существует.

Это мой единственный вариант сделать CREATE TABLE, запустите TRUNCATE TABLE, а затем заполнить таблицу?(3 отдельных запроса)

первоначальный вопрос был:

Мне было трудно понять, возможно ли следующее в MySQL без необходимости писать блочный sql:

CREATE TABLE fubar IF NOT EXISTS ELSE TRUNCATE TABLE fubar

Если я запускаю truncate отдельно перед созданием таблицы, а таблица не существует, то я получаю сообщение об ошибке.Я пытаюсь устранить это сообщение об ошибке без необходимости добавлять какие-либо дополнительные запросы.

Этот код будет выполнен с помощью PHP.

Это было полезно?

Решение

shmuel613, было бы лучше обновить ваш первоначальный вопрос, а не отвечать на него.Лучше всего, если есть одно место, содержащее полный вопрос, а не разбрасывать его в ходе обсуждения.

Ответ Бена разумен, за исключением того, что у него, кажется, есть "не" там, где он этого не хочет.Удаление таблицы только в том случае, если она не делает существовать - это не совсем правильно.

Вам действительно понадобится несколько инструкций.Либо условно создать, а затем заполнить:

  1. СОЗДАЙТЕ ВРЕМЕННУЮ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ fubar (идентификатор int, имя varchar(80))
  2. УСЕЧЬ ТАБЛИЦУ fubar
  3. ВСТАВИТЬ В fubar ВЫБЕРИТЕ * Из barfu

или просто отбросить и воссоздать заново

  1. УДАЛИТЬ ТАБЛИЦУ, ЕСЛИ СУЩЕСТВУЕТ fubar
  2. СОЗДАТЬ ВРЕМЕННУЮ ТАБЛИЦУ fubar, ВЫБРАТЬ идентификатор, имя ИЗ barfu

С чистым SQL это ваши два реальных класса решений.Мне больше нравится второе.

(С помощью хранимой процедуры вы могли бы свести ее к одному оператору.Что -то вроде:TruncateAndPopulate(fubar) Но к тому времени, когда вы напишете код для TruncateAndPopulate(), вы потратите больше времени, чем просто на использование SQL, описанного выше.)

Другие советы

Вы могли бы выполнить усечение после команды "создать, если не существует".Таким образом, он всегда будет существовать...и всегда будьте пусты в этот момент.

CREATE TABLE fubar IF NOT EXISTS
TRUNCATE TABLE fubar

выполните любой запрос, если таблица существует.

Использование: call Edit_table(database-name,table-name,query-string);

  • Процедура проверит наличие имени таблицы в имени базы данных и выполнит строку запроса, если она существует.Ниже приведена хранимая процедура:
DELIMITER $$

DROP PROCEDURE IF EXISTS `Edit_table` $$
CREATE PROCEDURE `Edit_table` (in_db_nm varchar(20), in_tbl_nm varchar(20), in_your_query varchar(200))
DETERMINISTIC
BEGIN

DECLARE var_table_count INT;

select count(*) INTO @var_table_count from information_schema.TABLES where TABLE_NAME=in_tbl_nm and TABLE_SCHEMA=in_db_nm;
IF (@var_table_count > 0) THEN
  SET @in_your_query = in_your_query;
  #SELECT @in_your_query;
  PREPARE my_query FROM @in_your_query;
  EXECUTE my_query;

ELSE
  select "Table Not Found";
END IF;

END $$
DELIMITER ;

Подробнее о Mysql

как насчет:

DROP TABLE IF EXISTS fubar;
CREATE TABLE fubar;

Или вы имели в виду, что просто хотите сделать это с помощью одного запроса?

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

$sql1 = "TRUNCATE TABLE fubar";
$sql2 = "CREATE TEMPORARY TABLE IF NOT EXISTS fubar SELECT id, name FROM barfu";

При первом запуске метода, содержащего это, он генерирует сообщение об ошибке при усечении, поскольку таблица еще не существует.

Мой единственный вариант - выполнить "СОЗДАТЬ ТАБЛИЦУ", запустить "УСЕЧЬ ТАБЛИЦУ", а затем заполнить таблицу?(3 отдельных запроса)

PS - спасибо, что так быстро ответили!

Если вы используете PHP, используйте mysql_list_tables - список таблиц чтобы проверить, существует ли таблица, прежде чем УСЕКАТЬ ее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top