主キーを構成するいくつかの列を持つテーブルがあります。格納されるデータの性質により、これらのフィールドの一部にNULL
値を含めることができます。テーブルを次のように設計しました。
CREATE TABLE `test` (
`Field1` SMALLINT(5) UNSIGNED NOT NULL,
`Field2` DECIMAL(5,2) UNSIGNED NULL DEFAULT NULL,
PRIMARY KEY (`Field1`, `Field2`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB;
ただし、describe test
これは次のように表示されます。
|| *Field* || *Type* || *Null* || *Key* || *Default* || *Extra*
|| Field1 || smallint(5) unsigned || NO || PRI || ||
|| Field2 || decimal(5,2) unsigned || NO || PRI || 0.00 ||
NULL
値を挿入するとエラーが発生し続けます。
列 'Field2'はnullにできません
これは、主キーの一部であるフィールドをnullにすることはできないためですか? NULL
に「0」を使用する以外に、私の選択肢は何ですか?
MySQLドキュメントから:
PRIMARY KEYは、すべてのキー列をNOT NULLとして定義する必要がある一意のインデックスです。もし彼らが
は明示的にNOT NULLとして宣言されていません。MySQLはそれらを暗黙的に(そして静かに)宣言します。テーブルには、1つの主キーのみを含めることができます。 PRIMARY KEYの名前は常にPRIMARYであるため、他の種類のインデックスの名前として使用することはできません。
http://dev.mysql.com/doc/refman/5.1/en/create-table.html
Field2がNULLになる可能性がある場合、すべての行でField1を区別する必要があるため、なぜ主キーの一部としてそれを必要とするのか疑問です。したがって、Field1だけで主キーとして十分なはずです。 Field2に異なるタイプのインデックスを作成できます。
主キーは、列を一意かつnull以外にするために使用されます
Null値を挿入して挿入するには、field2をniqueとして作成します
一意制約により、フィールドは重複を削除しますが、null値を許可します
主キーは、列にNULL
値があってはならないことを示しています。そのため、複合主キーの定義に使用される列はNULL
にはなりません。
また、Oracleサーバーは、複合主キー定義で使用されるすべての列の組み合わせを比較します。すべての列の既存データ(x、yなど)が新しく追加された行と一致した場合、一意制約違反のエラーが発生します。
さらに、このスレッドを見てください: 複合主キーのヌル可能列の何が問題になっていますか? .
このリンクは、複合キーのNULLABLE列の可能性に関する貴重な情報を提供します!
一意のキーを使用できます。このリンクをご覧ください。null値で機能します
http://www.xaprb.com/blog/2009/09/12/the-difference-between-a-unique-index-and-primary-key-in-mysql/
次のような一意のキーを使用できます。
mysql> CREATE TABLE `test` (
-> `Field1` SMALLINT(5) UNSIGNED NOT NULL,
-> `Field2` DECIMAL(5,2) UNSIGNED NULL DEFAULT NULL,
-> UNIQUE KEY (`Field1`, `Field2`)
-> )
-> COLLATE='latin1_swedish_ci'
-> ENGINE=InnoDB;
Query OK, 0 rows affected (0.03 sec)
mysql>
mysql> desc test
-> ;
+--------+-----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-----------------------+------+-----+---------+-------+
| Field1 | smallint(5) unsigned | NO | MUL | NULL | |
| Field2 | decimal(5,2) unsigned | YES | | NULL | |
+--------+-----------------------+------+-----+---------+-------+
2 rows in set (0.01 sec)