MySQL: таблица IF существует, усекает и вставляет ELSE create

Работа с MySQL (у меня практически нет знаний PHP), мне нужно иметь таблицу, которая по существу является подмножеством из гораздо более крупной таблицы. Исходная таблица время от времени меняется, теряя некоторые записи, приобретая другие новые и изменяя значения для существующих. Я могу описать, что хочу, но не могу понять синтаксис команд, чтобы заставить его работать. Я также знаю, что у меня могут быть два отдельных запроса и просто запускать то, что мне нужно, и у меня это получилось, но я хотел бы объединить их, если это возможно. Вот что я хочу:

ЕСЛИ поднаборная таблица НЕ СУЩЕСТВУЕТ, создайте ее как [select query], ELSE обрезает subset_table и вставьте [select query]

Как я уже сказал, я знаю, что есть другие способы сделать это: я мог бы отказаться, если бы существовал/создавал, или я мог бы просто запустить два разных файла sql. Я просто хочу знать, могу ли я сделать это, как указано выше.

Мысли?

Ответ 1

Вы можете сделать это:

create table if not exists <tablename> . . .;

truncate table <tablename>;

insert into <tablename>(cols)
    select blah blahblah . . .;

Вам вообще не нужны инструкции if.

Ответ 2

Это также можно сделать с помощью SP (хранимой процедуры)... делает его более читабельным и безопасным

DELIMITER $$

    DROP PROCEDURE IF EXISTS `create_table_sp`$$

    CREATE PROCEDURE `create_table_sp`()
    BEGIN

    IF NOT EXISTS (SELECT 1 FROM information_schema.TABLES WHERE table_name = '<table_name>'
    AND table_schema = DATABASE() AND table_type = 'BASE TABLE') THEN
        CREATE TABLE <subset_table_name>
        AS SELECT * FROM <main_table_name>;
    ELSE
        TRUNCATE TABLE <subset_table_name>;
        INSERT INTO <subset_table_name>
        AS SELECT * FROM <main_table_name>;
    END IF;

    END$$

    DELIMITER ;

    CALL `create_table_sp`;

DROP PROCEDURE IF EXISTS `create_table_sp`;

Существует и другой способ:

  • Вы можете передать имена таблиц в качестве аргументов для SP, в этом случае sub_table_name и main_table_name
  • Сделать вышеуказанные инструкции DML в строке с помощью CONCAT()
  • Создайте из него подготовленный оператор и выполните

Надеюсь, это помогло....