MySQL IS NOT NULL Condition — Поиск значений, отличных от NULL, в столбце

Автор Кедар Гуле / 2 ноября 2020 г. 21 августа 2022 г.

В этом руководстве мы рассмотрим условие MySQL IS NOT NULL . IS NOT NULL Условие полностью противоположно условию IS NOT NULL . IS NOT NULL фильтрует таблицу для столбца и возвращает только те записи, которые не имеют значения NULL в этом конкретном столбце. Это условие часто используется с ГДЕ пункт.

Как упоминалось в статье об условии IS NULL, отсутствующие значения могут быть проблемой в больших таблицах, что приводит к ошибкам во время вычислений. Кроме того, мы не можем использовать операторы сравнения, такие как = и !=, для проверки значения NULL в MySQL.


Синтаксис для условия IS NOT NULL

 Выражение SELECT FROM table_name WHERE column_name IS NOT NULL;  Язык кода: SQL (язык структурированных запросов) (sql)  

Пример условия MySQL IS NOT NULL

Рассмотрим следующую таблицу Таблица сотрудников.

Таблица сотрудников

1. Использование IS NOT NULL для поиска значений, отличных от NULL

Давайте найдем значения, отличные от NULL , в столбце Date_Joined, используя оператор SELECT . Мы делаем это с помощью следующего запроса:

 SELECT * FROM Employee WHERE Date_Joined IS NOT NULL;  Язык кода: SQL (Structured Query Language) (sql)  

На выходе получаем

Как видите, первые три записи в таблице не имеют NULL значение в столбце Date_Joined и, следовательно, мы получаем их в нашем результате.

В случае, если конкретный столбец имеет все значений NULL , тогда мы получаем пустой набор в результирующем наборе.

2. Использование IS NOT NULL для обновления значений, отличных от NULL

Вы можете обновить значения, отличные от NULL , используя условие IS NOT NULL вместе с оператором UPDATE . Запрос:

 UPDATE Employee SET Date_Joined = '2020-11-01' ГДЕ Date_Joined НЕ НУЛЕВОЕ;  Язык кода: SQL (язык структурированных запросов) (sql)  

При этом будут отфильтрованы все значения, отличные от NULL в столбце Date_Joined, и будет установлено их значение «2020-11-01». Мы получим вывод как

Вы также можете использовать оператор DELETE вместе с условием IS NOT NULL так же, как мы используем его для условия IS NULL . С практической точки зрения, в большинстве случаев вы не удаляете записи, отличные от NULL значений, в отличие от NULL записей значений.


Заключение

В больших таблицах условие IS NOT NULL может быть очень полезным для извлечения только значений, отличных от NULL , и выполнения над ними вычислений. Для дальнейшего чтения я настоятельно рекомендую вам пройти по ссылкам в справочниках.


Ссылки

  • Официальная документация MySQL по условию IS NOT NULL .
  • Статья JournalDev о НЕ НУЛЕВАЯ 9Состояние 0006.

Безопасное добавление столбцов NOT NULL в таблицы вашей базы данных (2023)

Команда по миграции баз данных отвечает за создание и поддержку всех внутренних инструментов для команд Shopify для безопасного внесения изменений в схему с минимальным временем простоя.

Одно из наших последних исследований касалось использования популярного гема Large Hadron Migrator (LHM) для выполнения изменений схемы в базах данных MySQL после проверки безопасности, позволяющей выполнять миграцию без потери каких-либо данных. В частности, при добавлении NOT NULL столбцов в существующую таблицу.

В этом посте я поделюсь тем, что мы узнали, и нашими рекомендациями для ваших собственных таблиц базы данных.

Во-первых, важно понять, как определяется безопасность изменений схемы.

Для этой цели мы должны знать о процедуре, которую LHM использует для выполнения миграции, поскольку она использует механизм

теневой таблицы , чтобы гарантировать минимальное время простоя во время выполнения миграции. Короче говоря, LHM создает новую таблицу (известную как теневая таблица ) с примененным изменением схемы и устанавливает триггеры в исходной таблице для заполнения любых операций, связанных с данными ( INSERT , UPDATE и DELETE ) в теневой таблице . Затем он начинает пакетное копирование записей из исходной таблицы в теневую. Когда все записи будут скопированы в теневую таблицу, LHM автоматически переименует две таблицы, а затем удалит триггеры из исходной.

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

Таким образом, изменения схемы идентифицируются как безопасные , если:

  • После начала миграции: ВСТАВИТЬ , ОБНОВЛЕНИЕ и DELETE операций, нацеленных на исходную таблицу , могут заполнять данными
    теневую таблицу
    (с помощью триггеров MySQL) без сбоев. Это известно как обратная совместимость.
  • После завершения миграции: количество записей в теневой таблице должно быть равно количеству записей в исходной таблице (через триггеры MySQL и пакетные вставки LHM).

Как указано в заголовке, это исследование сосредоточено на одном конкретном наборе изменений схемы, добавлении NOT NULL столбцы ограничены таблицей. Принимая во внимание внутреннюю работу LHM, можно только догадываться, какие значения будут помещены во вновь добавленный столбец для всех 90 119 исходных 90 120 записей таблицы, в которых изначально отсутствует значение для этого столбца.

Таким образом, при исследовании безопасности этих изменений схемы будут учитываться следующие факторы:

  • Включение значения ПО УМОЛЧАНИЮ для определения нового столбца в той же миграции.
  • Включение UNIQUE INDEX для нового столбца в той же миграции.
  • Режим, на который настроен экземпляр MySQL ( строгий   или нестрогий ).

Для проведения исследования определены несколько шагов для моделирования того, как LHM будет выполнять миграцию при повторении рассматриваемых факторов.

В демонстрационных целях предположим, что миграция добавляет столбец NOT NULL с именем 9.0119 «last_name» в таблицу с именем «users» .

1. Инициализация: установлен режим MySQL и создана исходная таблица.

2. Создание таблицы: Смоделируйте, как LHM применит миграцию.

3. Определение триггеров: смоделируйте, как LHM настроит триггеры MySQL.

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

оригинал в теневой стол . Эти операторы зависят от тестируемой операции SQL ( INSERT , UPDATE и DELETE ).

1. Заполните исходные данные: Создайте исходные записи для выполнения запросов исследования.

2. Активируйте триггеры SQL: выполните определенные запросы, чтобы активировать смоделированные триггеры LHM.

3. Сравните результаты: выполните запрос SELECT как в исходная и теневая таблица, чтобы сравнить их записи (как по длине, так и по содержанию).

Объединив все шаги раздела Experiment Setup вместе с этими шагами, мы можем определить безопасность добавления NOT NULL изменений схемы столбцов, в зависимости от факторов, указанных в разделе 2 ( DEFAULT пункт, UNIQUE INDEX существование и режим MySQL). Полный последовательный эксперимент для INSERT операций, будет выглядеть так:

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

Поскольку количество записей между исходной и теневой таблицами различно, мы заключаем, что выполнение операций INSERT, когда есть NOT NULL

, DEFAULT определено изменение схемы, которое также вводит UNIQUE INDEX в этом столбце, может привести к потере данных , если экземпляр MySQL настроен на строгий режим.

Подобно тому, как мы построили экспериментальный случай в предыдущем разделе, мы можем повторять факторы эксперимента (тип операции, включение значения DEFAULT , наличие UNIQUE INDEX и режим MySQL), чтобы построить матрицу безопасности изменения схемы. для всех полученных комбинаций.

Напоминаем, что безопасность изменения схемы определяется ответами на два вопроса:

  • Будет ли миграция обратно совместима с ? Другими словами, могут ли операции INSERT , UPDATE и DELETE , нацеленные на исходную таблицу , заполнять данные в теневую таблицу (через триггеры MySQL) без сбоя.
  • Приведет ли миграция к потере данных ? Другими словами, равно ли количество записей в теневой таблице количеству записей в исходной таблице после завершения миграции.

Спецификация колонки

Изменение схемы

Режим MySQL

Эксплуатация

Обратная совместимость?

Потеря данных?

НЕ НУЛЕВОЕ, со значением ПО УМОЛЧАНИЮ

Не включает УНИКАЛЬНЫЙ ИНДЕКС

STRICT_ALL_TABLES

ВСТАВКА

Да

ОБНОВЛЕНИЕ

Да

УДАЛИТЬ

Да

НО_ДВИГАТЕЛЬ_ЗАМЕНА

ВСТАВКА

Да

ОБНОВЛЕНИЕ

Да

УДАЛИТЬ

Да

Включает УНИКАЛЬНЫЙ ИНДЕКС

STRICT_ALL_TABLES

ВСТАВКА

Да

Да

ОБНОВЛЕНИЕ

Да

Да

УДАЛИТЬ

Да

НО_ДВИГАТЕЛЬ_ЗАМЕНА

ВСТАВКА

Да

Да

ОБНОВЛЕНИЕ

Да

Да

УДАЛИТЬ

Да

NOT NULL без значения ПО УМОЛЧАНИЮ

Не включает УНИКАЛЬНЫЙ ИНДЕКС

STRICT_ALL_TABLES

ВСТАВКА

-

ОБНОВЛЕНИЕ

-

УДАЛИТЬ

-

НО_ДВИГАТЕЛЬ_ЗАМЕНА

ВСТАВКА

Да

№*

ОБНОВЛЕНИЕ

Да

№*

УДАЛИТЬ

Да

№*

Включает УНИКАЛЬНЫЙ ИНДЕКС

STRICT_ALL_TABLES

ВСТАВКА

-

ОБНОВЛЕНИЕ

-

УДАЛИТЬ

-

НО_ДВИГАТЕЛЬ_ЗАМЕНА

ВСТАВКА

Да

Да

ОБНОВЛЕНИЕ

Да

Да

УДАЛИТЬ

Да

№*

* Количество записей в теневой таблице совпадает с количеством записей в исходной таблице , но для нового столбца выбрано неявное значение DEFAULT . В этом эксперименте значением была пустая строка («»), но оно будет варьироваться в зависимости от типа данных (проверьте неявные значения по умолчанию MySQL).

Учитывая матрицу случаев из предыдущего раздела:

  1. Избегайте добавления столбца NOT NULL без значения по умолчанию. Изменения схемы, вводящие столбцы NOT NULL , должны определить значение DEFAULT , чтобы избежать непредвиденных результатов при миграции.

    В худшем случае (когда экземпляр MySQL настроен на строгий режим) затронутая миграцией таблица нарушит совместимость с существующими приложениями, так как ранее использовались операции, связанные с данными ( ВСТАВИТЬ / ОБНОВЛЕНИЕ / УДАЛИТЬ ) не удалось заполнить таблицу shadow после начала миграции.

    В лучшем случае (когда экземпляр MySQL настроен на нестрогий режим) записи, заполняемые из исходной таблицы в таблицу теневой таблицы либо триггерами MySQL, либо пакетными вставками LHM, получат неявный Значение по умолчанию для нового столбца, что, вероятно, нежелательно.

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

    Рекомендуется, чтобы разработчики проверяли наличие дубликатов, прежде чем добавлять индекс UNIQUE для набора столбцов.

Это расследование было завершено благодаря отзывам, предоставленным всеми членами команды DB Migrations: Бастианом Бартманном, Сергеем Федоровым, Аней Зенкиной, Сяоли Лян; и преданное руководство Шухао Ву.

Синклер Перес — инженер-технолог в Shopify. Вы можете связаться с ним в Twitter и Github.

Если вас интересует создание систем с нуля для решения реальных проблем, в нашем инженерном блоге есть истории о других проблемах, с которыми мы столкнулись.