web-dev-qa-db-ja.com

DEFAULT NULLのMySQL列-文体の選択、またはそれですか?

SQLの多くの種類では、行を挿入するたびに列を暗黙的にNULLに設定する方法が3つあります。これらは:

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

つまり1つ目は(NOT NULLではなく)NULLフラグを設定し、2つ目はNULLフラグをデフォルト値のままにし、3つ目はNULLフラグを設定して暗黙的な値をNULLに設定します。

Microsoft SQLでは、テーブルまたはスキーマのNULLフラグのデフォルト値をカスタマイズすることもできるため、2番目のバリエーションはまったく同じではないという話を聞きました。

しかし、MySQLの場合、そのような機能があるとは思いません。さらに、MySQLでは、厳密なモードがオンになっている場合でも、明示的な値がない場合、NOT NULL列とは異なり、NULLフラグのある列は常に挿入時に暗黙的にNULLに設定されます。したがって、これらの列宣言はすべて同じままです。

私のMySQLスクリプトでは、すべてのNOT NULL列に対して、厳密なモードを有効にする場合の問題を回避するために、アプリケーションの一部の挿入で設定する予定のない列にDEFAULT値を指定します。したがって、3番目のバリエーションを選択すると、最も冗長で明示的なものであるにもかかわらず、より対称的だと感じます。 3番目のバリエーションのような宣言は一般的ですか、それとも1番目または2番目のバリエーションは他のスクリプトでより頻繁に発生しますか?

MySQLダンプが使用するエイリアスであるため、私は2番目のアプローチに頼ることを検討していましたが、列宣言のデフォルト句で整数リテラルを文字列(単一引用符)としてダンプするので、これは良いアイデアだとは思いません。

この質問は、解決策のある質問よりも意見が多いように思われるかもしれませんが、私が気付いていない潜在的な落とし穴も知っておきたいと思います。将来、MySQLからPostgreSQLへの移行を選択する可能性があります。また、これらの専門家からのアドバイスも使用できます。 PostgreSQLがMS-SQLのようにこれらのケースを区別する場合。私が間違った仮定をした場合、私が間違っていれば私を訂正してください。

20
Kevin Jin

私が遭遇したすべてのデータベースは、あなたがそれらを説明する方法でNULLを扱います。列がNULL値を受け入れる場合、INSERTで値を指定しないと、デフォルトで値がNULLになります。これはANSI標準の動作の一部だと思います。

「NULL」自体の指定についても同様です。それは好みの問題です。標準では、列はNULLを許可するとしていますnless NOT NULLが指定されています(データ定義言語のレベルで)。したがって、NULL自体は不要であり、4番目の同等のオプションがあります。

columnname type

NULLは、ANSI標準を通じてSQL言語に完全に埋め込まれています。 3番目のオプションは最も明白ですが、少し変わっているようにも見えます。

システム全体で一貫性を保つことを計画している場合、私はあなたが進んでいる道をたどります。すべてのテーブルのすべての列について、NULLまたはNOT NULLがあります。デフォルト値を取るすべての列について、DEFAULTステートメントを作成します。

ただし、一緒に働く他の人(現在または将来)がすぐにこの例に従うことを期待しないでください。タイプ数が少なく、すべての(またはほとんどすべての)SQL方言がどのように動作するかという理由だけで、この場合は4番目のオプションを好む人が多いでしょう。

11
Gordon Linoff

データタイプのデフォルト値 に記載されているとおり:

列が値としてNULLを取ることができる場合、その列は明示的なDEFAULT NULL句で定義されます。

暗黙ではなくexplicitを意味していたと思います)。

さらに、 CREATE TABLE構文 に記載されているとおり:

NULLNOT NULLも指定されていない場合、列はNULLが指定されているものとして扱われます。

したがって、MySQLでは、次の列定義はすべて同じです。

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

どちらを使用するかの選択は、明示的であるか簡潔であるかのバランスです。状況に応じて、上記のいずれかを使用する場合があります。

21
eggyal