web-dev-qa-db-ja.com

MySQL整数0とNULL

整数列を使用する場合、値がないことを示すために0またはNULLを使用することをお勧めします。

たとえば、テーブルにparent_idフィールドがあり、特定のエントリに親がない場合、0またはNULLを使用しますか?

私は過去に常に0を使用してきました。なぜなら、私はJava世界から来たからです(1.5以前)整数は常に値を持つ必要がありました。

私は主にパフォーマンスに関して尋ねていますが、どちらが「より正しい」オプションであるかについてあまり心配していません。

25
monkjack

2つの理由から、NULLを使用することをお勧めします。

  1. NULLは、フィールドに値がないことを意味します。これは、まさにモデル化しようとしているものです。
  2. 将来的に参照整合性制約を追加する場合は、NULLを使用する必要があります。
30
Hosam Aly

可能であれば、列をNOT NULLとして宣言します。インデックスをより効果的に使用できるようにし、各値がNULLかどうかをテストするためのオーバーヘッドをなくすことで、SQL操作を高速化します。また、列ごとに1ビットのストレージスペースも節約できます。テーブルに本当にNULL値が必要な場合は、それらを使用してください。すべての列でNULL値を許可するデフォルト設定を避けてください。

MySQL-データサイズの最適化

25
uldis.zarins

「値なし」にNULLを使用することは、文字通り正しいです。 0は整数の値なので、意味があります。 NULL otohは文字通り何もないことを意味するため、値はありません。

パフォーマンスはおそらく無関係ですが、NULLを正しく使用してコーディングする方法を学べば、NULLを使用した方が多少高速になる可能性があります。

6
jwenting

これと実際のパフォーマンスの違いを期待するべきではありません

3
Brian

Parent_idの例では、「root」を表すため、0は完全に有効です。ほとんどの場合、論理的に「値なし」にはNULLの方が適しています。

ただし、私が知っているパフォーマンスへの影響はありません。

3
kapa

UNIQUE( id1, id2 )は、たとえば1, nullを2回許可するため、null値では機能しません。

一方、0、JOIN atable ON this.extID = atable.IDを使用すると、結合が実行され(結果として行が結合されなくなります)、NULLは無視されます。

とにかく、空の値がNULLと異なる意味を持たない限り、NULLの代わりに常に「空の値」(0や空の文字列など)を使用することをお勧めします

また、クエリを次のように変更します:JOIN atable ON this.extID = atable.id AND extID > 0は、無駄な結合の実行を防ぎます

2
sveva

0は、まだ整数列の有効な値です。したがって、NULLを使用して、その列でnullを許可する必要があります。

また、正の数値のみにinteger列を使用している場合は、no値に-1を使用できます。

parent_idを使用する0参照の例では、ID 0で始まる参照IDがないことを確認するまで問題ありません。

2
Sachin Shanbhag

実際に0が値として使用されることを期待していない場合は、NULLの代わりに0を使用できると思います。

たとえば、列が外部キーです。外部キーは通常0で始まるのではなく、1で始まるため、0が値として使用されることを期待しないことを意味します。

次に、0を使用して「No」値の状態を示すことができます。結合で使用しても、他のテーブルのどの列とも一致しません。したがって、NULLと同じ効果があります。

しかし、実際に0が意味を持つ列がある場合。たとえば数量フィールドのように。それとは別に、価値を表現して空にする必要もあります。たとえば、数量がまだ入力されていないことを示します。次に、そのためのNULLが必要です。

それが理にかなっていると思います。

1
chrony