Я пытаюсь вставить столбец в таблицу, если его там еще нет. Что-то вроде DROP COLUMN IF EXISTS не работает (удаление и добавление столбца не работает), очевидно, потому что моя версия MySQL не поддерживает такого рода условия if. У меня вопрос: можно ли вставить столбец в таблицу на основе оператора CASE?

Я уже понял, как определить, существует ли столбец, но я пытаюсь вставить столбец на основе этого условия.

case statement я бы хотел, чтобы работа выглядела примерно так:

    CASE WHEN    (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS
                 WHERE TABLE_SCHEMA='PSIP-1.Standardproject_V2.5_notvalid'
                 AND TABLE_NAME='PS_Relevant Rail Stations$Loc'
                 AND COLUMN_NAME='triade') 
    IS NULL THEN 
    ALTER TABLE PS_Relevant Rail Stations$Loc
    ADD COLUMN triade;

Я также не уверен, куда поместить это CASE statement, так как этот код не будет работать сам по себе. Нужно ли начинать с UPDATE PS_Relevant Rail Stations$Loc, а затем продолжить с CASE?

0
anthony 22 Ноя 2019 в 14:01

1 ответ

Вы можете реализовать эту функцию с помощью хранимой процедуры, которая принимает в качестве входных данных имя БД, имя таблицы, имя столбца и определение столбца, а если имя столбца не существует в указанной таблице, создает динамический оператор SQL для его создания. Например:

DELIMITER //

DROP PROCEDURE IF EXISTS add_column_if_not_exists //

CREATE PROCEDURE add_column_if_not_exists(IN dbname VARCHAR(50), 
                                          IN tblname VARCHAR(50), 
                                          IN colname VARCHAR(50),
                                          IN coltype VARCHAR(50))
BEGIN
  IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
                 WHERE TABLE_SCHEMA=dbname
                 AND TABLE_NAME=tblname
                 AND COLUMN_NAME=colname) THEN
    SET @sql = CONCAT('ALTER TABLE `', dbname, '`.`', tblname, '` ADD COLUMN `', colname, '` ', coltype);
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
  END IF;
END //

DELIMITER ;

Затем вы бы вызвали эту процедуру следующим образом (изменив определение столбца соответствующим образом)

CALL add_column_if_not_exists('PSIP-1.Standardproject_V2.5_notvalid',
                              'PS_Relevant Rail Stations$Loc',
                              'triade',
                              'INT NOT NULL DEFAULT 0')

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

1
Nick 23 Ноя 2019 в 07:42