主キーで NULL が許可される理由と DBMS は? 質問する

主キーで NULL が許可される理由と DBMS は? 質問する

私の質問の続き「TSQL で「非 null 主キー」を使用するのはなぜですか?」...

他の議論から理解したように、一部のRDBMS(例えばSQLite、 マイグレーション ) 主キーに「一意の」 NULL を許可します。

なぜこれが許可され、どのように役立つのでしょうか?

背景: さまざまな DBMS における基本的な概念、アプローチ、およびその実装の違いを理解することは、同僚やデータベース専門家とのコミュニケーションに有益であると考えています。

ノート

  • MySQL が修復され、「NOT NULL PK」リストに戻りました。
  • SQLite が (Paul Hadfield 氏に感謝して)「NULL PK」リストに追加されました:

主キー値の一意性を決定するために、NULL 値は、他の NULL 値を含む他のすべての値とは異なるものとみなされます。

INSERT または UPDATE ステートメントが、2 つ以上の行に同一の主キー値が含まれるようにテーブルの内容を変更しようとすると、制約違反になります。SQL 標準によれば、PRIMARY KEY は常に NOT NULL を意味します。残念ながら、長年のコーディング上の見落としにより、SQLite ではこれが当てはまりません。

列がINTEGER PRIMARY KEYでない限りSQLiteではPRIMARY KEY列にNULL値が許可されます標準に準拠するように SQLite を変更することはできました (将来的にはそうするかもしれません) が、見落としが発見された時点では、SQLite は非常に広く使用されていたため、問題を修正するとレガシー コードが壊れるのではないかと懸念していました。

そのため、現時点では、PRIMARY KEY 列で NULL を引き続き許可することを選択しました。ただし、開発者は、将来 SQLite が SQL 標準に準拠するように変更される可能性があることを認識し、それに応じて新しいプログラムを設計する必要があります。

SQLite で理解される SQL: CREATE TABLE

ベストアンサー1

NULL 値が許可される列 Kn を含む主キーがあるとします。

2 行目の Kn が null であり、テーブルに Kn が null の行がすでに含まれていることを理由に 2 行目を拒否する場合、実際には、システムが比較 "row1.Kn = row2.Kn" を TRUE として扱うことを要求していることになります (何らかの方法で、これらの行のキー値が実際に等しいことをシステムに検出させたいからです)。ただし、この比較は結局 "null = null" の比較になり、標準では null はそれ自体を含め、何とも等しくないと既に明示的に指定されています。

あなたが望むことを許可するということは、SQL が null の処理に関する独自の原則から逸脱することを意味します。SQL には無数の矛盾がありますが、この特定の矛盾は委員会を通過することはありませんでした。

おすすめ記事