27

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

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

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

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

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

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

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

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

4

2 に答える 2

30

Data Type Default Valuesに記載されているとおり:

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

(明示的ではなく暗黙的を意味していると思います)。

さらに、CREATE TABLESyntaxの下に記載されているように:

どちらNULLNOT NULL指定されていない場合、列は指定されているかのように扱われNULLます。

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

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

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

于 2012-09-03T20:21:20.763 に答える
16

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

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

columnname type

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

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

ただし、(現在または将来) 一緒に仕事をする他の人がこの例にすぐに従うことを期待しないでください。多くの場合、入力が少なくて済み、すべて (またはほぼすべて) の SQL ダイアレクトが動作するため、4 番目のオプションが好まれます。

于 2012-09-03T20:21:34.877 に答える