私の質問の続き「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 標準に準拠するように変更される可能性があることを認識し、それに応じて新しいプログラムを設計する必要があります。
ベストアンサー1
NULL 値が許可される列 Kn を含む主キーがあるとします。
2 行目の Kn が null であり、テーブルに Kn が null の行がすでに含まれていることを理由に 2 行目を拒否する場合、実際には、システムが比較 "row1.Kn = row2.Kn" を TRUE として扱うことを要求していることになります (何らかの方法で、これらの行のキー値が実際に等しいことをシステムに検出させたいからです)。ただし、この比較は結局 "null = null" の比較になり、標準では null はそれ自体を含め、何とも等しくないと既に明示的に指定されています。
あなたが望むことを許可するということは、SQL が null の処理に関する独自の原則から逸脱することを意味します。SQL には無数の矛盾がありますが、この特定の矛盾は委員会を通過することはありませんでした。