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 для безопасного внесения изменений в схему с минимальным временем простоя.
NOT NULL
столбцов в существующую таблицу.В этом посте я поделюсь тем, что мы узнали, и нашими рекомендациями для ваших собственных таблиц базы данных.
Во-первых, важно понять, как определяется безопасность изменений схемы.
Для этой цели мы должны знать о процедуре, которую LHM использует для выполнения миграции, поскольку она использует механизм INSERT
, UPDATE
и DELETE
) в теневой таблице . Затем он начинает пакетное копирование записей из исходной таблицы в теневую. Когда все записи будут скопированы в теневую таблицу, LHM автоматически переименует две таблицы, а затем удалит триггеры из исходной.
Эта процедура обеспечивает минимальное время простоя (см. ограничения таблицы переименования MySQL) во время миграции, но она создает новый набор потенциальных проблем, поскольку нам нужно убедиться, что пакетные вставки не удаляют записи в процессе. , что может произойти в зависимости от примененного изменения схемы.
Таким образом, изменения схемы идентифицируются как безопасные , если:
- После начала миграции:
ВСТАВИТЬ
,ОБНОВЛЕНИЕ
иDELETE
операций, нацеленных на исходную таблицу , могут заполнять данными - После завершения миграции: количество записей в теневой таблице должно быть равно количеству записей в исходной таблице (через триггеры 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 будут заполнять их из 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).
Учитывая матрицу случаев из предыдущего раздела:
- Избегайте добавления столбца NOT NULL без значения по умолчанию. Изменения схемы, вводящие столбцы
NOT NULL
, должны определить значениеDEFAULT
, чтобы избежать непредвиденных результатов при миграции.В худшем случае (когда экземпляр MySQL настроен на строгий режим) затронутая миграцией таблица нарушит совместимость с существующими приложениями, так как ранее использовались операции, связанные с данными (
ВСТАВИТЬ
/ОБНОВЛЕНИЕ
/УДАЛИТЬ
) не удалось заполнить таблицу shadow после начала миграции.В лучшем случае (когда экземпляр MySQL настроен на нестрогий режим) записи, заполняемые из исходной таблицы в таблицу теневой таблицы либо триггерами MySQL, либо пакетными вставками LHM, получат неявный
Значение по умолчанию
для нового столбца, что, вероятно, нежелательно. - Будьте предельно осторожны при добавлении UNIQUE INDEX. Введение индексов
UNIQUE
в механизмы изменения схемы, которые используют механизм теневой таблицы для выполнения своих миграций, оказалось опасным, поскольку это может привести к потере данных при наличии повторяющихся значений для столбцов, покрываемых индексом, до к миграциям.Рекомендуется, чтобы разработчики проверяли наличие дубликатов, прежде чем добавлять индекс
UNIQUE
для набора столбцов.
Это расследование было завершено благодаря отзывам, предоставленным всеми членами команды DB Migrations: Бастианом Бартманном, Сергеем Федоровым, Аней Зенкиной, Сяоли Лян; и преданное руководство Шухао Ву.
Синклер Перес — инженер-технолог в Shopify. Вы можете связаться с ним в Twitter и Github.
Если вас интересует создание систем с нуля для решения реальных проблем, в нашем инженерном блоге есть истории о других проблемах, с которыми мы столкнулись.