mySql удалить столбец, если он не существует - PullRequest
1 голос
/ 10 июля 2020

Я пытаюсь написать код миграции SQL, и я написал следующий код. Это не работает, и я получаю сообщение об ошибке:

Can't DROP 'column_name_arg'; проверьте, существует ли столбец / ключ.

Это означает, что я не использую переменную аргумента.

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

drop procedure if exists schema_change;

delimiter ';;'
create procedure schema_change(in table_name_arg VARCHAR(40), in column_name_arg VARCHAR(40))
begin
    if exists(select *
              from information_schema.columns
              where table_schema = schema()
                and table_name = table_name_arg
                and column_name = column_name_arg) then
        alter table TestResults
            drop column column_name_arg;
    end if;
end;;

delimiter ';'
call schema_change('TestResults', 'minScore');
call schema_change('TestResults', 'maxScore');

drop procedure if exists schema_change;

1 Ответ

0 голосов
/ 10 июля 2020

Для этого вы можете использовать подготовленный оператор. Имя столбца не может быть переменной.

Процедура создания:

drop procedure if exists schema_change;

delimiter //
create procedure schema_change(in table_name_arg VARCHAR(40), in column_name_arg VARCHAR(40))
begin
    if exists(select *
              from information_schema.columns
              where table_schema = schema()
                and table_name = table_name_arg
                and column_name = column_name_arg) then
            SELECT CONCAT('ALTER TABLE TestResults drop column ',column_name_arg) INTO @sqlv;
            PREPARE stmt FROM @sqlv;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;
    end if;
end;
//
delimiter ;

Показать таблицу до:

MariaDB [bernd]> desc TestResults;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| x     | int(11) | YES  |     | NULL    |       |
| y     | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

Процедура вызова:

MariaDB [bernd]> call schema_change('TestResults', 'y');
Query OK, 0 rows affected (0.03 sec)

Показать таблицу после:

MariaDB [bernd]> desc TestResults;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| x     | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

MariaDB [bernd]>
...