Используя ИЗМЕНЯЮТСЯ для отбрасывания столбца, если он существует в MySQL

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

77
задан enharmonic 15 May 2019 в 01:16
поделиться

3 ответа

MySQL For, нет ни одного: MySQL Feature Request .

, Позволяющий это, является возможно действительно плохой идеей, так или иначе: IF EXISTS указывает, что Вы выполняете разрушительные операции на базе данных с (Вам) неизвестная структура. Могут быть ситуации, где это приемлемо для быстрой-и-грязной локальной работы, но если Вы испытываете желание выполнить такой оператор против производственных данных (в миграции и т.д.), Вы играете с огнем.

, Но если Вы настаиваете, не трудно просто проверить на существование сначала в клиенте или зафиксировать ошибку.

MariaDB также поддерживает следующий запуск с 10.0.2:

ОТБРАСЫВАНИЕ [СТОЛБЕЦ] [ЕСЛИ СУЩЕСТВУЕТ] col_name

т.е.

ALTER TABLE my_table ОТБРАСЫВАНИЕ, ЕСЛИ СУЩЕСТВУЕТ my_column;

, Но это - возможно плохая идея полагаться на нестандартную функцию, поддерживавшую только одним из нескольких ветвлений MySQL.

57
ответ дан MattW. 24 November 2019 в 10:58
поделиться

Нет никакого языкового уровня поддержки для этого в MySQL. Вот работа, включающая MySQL Information_schema Meta-data в 5.0+, но она не будет решать вашу проблему в 4.0.18.

drop procedure if exists schema_change;

delimiter ';;'
create procedure schema_change() begin

    /* delete columns if they exist */
    if exists (select * from information_schema.columns where table_schema = schema() and table_name = 'table1' and column_name = 'column1') then
        alter table table1 drop column `column1`;
    end if;
    if exists (select * from information_schema.columns where table_schema = schema() and table_name = 'table1' and column_name = 'column2') then
        alter table table1 drop column `column2`;
    end if;

    /* add columns */
    alter table table1 add column `column1` varchar(255) NULL;
    alter table table1 add column `column2` varchar(255) NULL;

end;;

delimiter ';'
call schema_change();

drop procedure if exists schema_change;

Я написал более подробную информацию в блоге .

43
ответ дан 24 November 2019 в 10:58
поделиться

Ответ Chase Seibert работает, но я добавил, что если у вас есть несколько схемы, которые вы хотите изменить выбор Таким образом:

select * from information_schema.columns where table_schema in (select schema()) and table_name=...
5
ответ дан 24 November 2019 в 10:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: