MySQL столбцы с DEFAULT NULL - стилистический выбор, или это?

Во многих разновидностях SQL существует три способа, которыми вы можете неявно устанавливать столбец в NULL при каждой вставке строки. Это:

columnname type NULL
columnname type DEFAULT NULL
columnname type NULL DEFAULT NULL

Т.е. первый устанавливает флаг NULL (в отличие от NOT NULL), второй оставляет флаг NULL со значением по умолчанию, а третий устанавливает флаг NULL и устанавливает неявное значение как NULL.

Я слышал о том, что в Microsoft SQL второй вариант не совсем тот же, поскольку вы также можете настроить значение по умолчанию для флага NULL для таблиц или схем.

Но для MySQL я не верю, что есть такая особенность. Кроме того, в MySQL столбцы с флагом NULL, в отличие от столбцов NOT NULL, всегда неявно устанавливаются в NULL при вставке, если нет явного значения, даже если включен строгий режим. Таким образом, все эти объявления столбцов остаются идентичными.

В моем сценарии MySQL для каждого столбца NOT NULL я указываю значение DEFAULT для столбцов, которые я не собираюсь устанавливать в некоторых вставках в моем приложении, чтобы избежать каких-либо проблем, если бы я включил строгий режим. Таким образом, я чувствую, что было бы более симметрично, если бы я выбрал третий вариант, даже если он является самым многословным и явным. Являются ли объявления, подобные третьему варианту, общими, или первый или второй вариант встречаются чаще в сценариях других пользователей?

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

Этот вопрос может показаться большим мнением, чем тот, у которого есть решение, но я также хочу знать о любых потенциальных ошибках, о которых я не знаю. Я могу выбрать миграцию с MySQL на PostgreSQL в будущем, и я также мог бы воспользоваться некоторыми советами этих экспертов, например, если PostgreSQL различает эти случаи, как MS-SQL. Поправь меня, если я ошибаюсь, если я сделал какие-то неверные предположения.

Ответ 1

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

Что касается указания самой "NULL". Это вопрос предпочтения. В стандарте говорится, что столбец допускает NULL, если не указан NOT NULL (на уровне языка определения данных). Таким образом, NULL сам по себе является ненужным, и у вас есть четвертый эквивалентный вариант:

columnname type

NULL достаточно встроены в язык SQL через стандарт ANSI. Ваш третий вариант наиболее явный, но он также выглядит немного необычным.

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

Однако не ожидайте, что другие люди, с которыми вы работаете (сейчас или в будущем), легко следуете этому примеру. Многие предпочли бы четвертый вариант в этом случае просто потому, что он требует меньше набора текста и как все (или почти все) SQL-диалекты ведут себя.

Ответ 2

Как указано в типе значений по умолчанию:

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

(Я думаю, что они подразумевали неявный, а не явный).

Более того, как CREATE TABLE Синтаксис:

Если не указано ни NULL ни NOT NULL, столбец обрабатывается так, как если бы был указан NULL.

Поэтому в MySQL следующие определения столбцов идентичны:

columnname type
columnname type NULL
columnname type DEFAULT NULL
columnname type NULL DEFAULT NULL

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