MySql - создать таблицу, если не существует, еще усечение? - PullRequest
20 голосов
/ 17 сентября 2008

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

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

$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.

Ответы [ 6 ]

22 голосов
/ 17 сентября 2008

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

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

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

  1. СОЗДАТЬ ВРЕМЕННУЮ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ fubar (id int, имя varchar (80))
  2. TRUNCATE TABLE fubar
  3. ВСТАВИТЬ В Fubar ВЫБРАТЬ * ОТ Barfu

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

  1. УДАЛИТЬ СТОЛ, ЕСЛИ СУЩЕСТВУЕТ fubar
  2. CREATE TEMPORARY TABLE fubar SELECT id, имя ОТ barfu

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

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

3 голосов
/ 03 ноября 2009

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

Использование: 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

3 голосов
/ 17 сентября 2008

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

CREATE TABLE fubar IF NOT EXISTS
TRUNCATE TABLE fubar
2 голосов
/ 17 сентября 2008

как насчет:

DROP TABLE IF EXISTS fubar;
CREATE TABLE fubar;

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

0 голосов
/ 03 ноября 2009

Если вы используете PHP, используйте mysql_list_tables , чтобы проверить, что таблица существует до TRUNCATE.

0 голосов
/ 17 сентября 2008

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

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

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

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

PS - спасибо за быстрый ответ!

...