web-dev-qa-db-ja.com

複数列の主キーのNULL値

主キーを構成するいくつかの列を持つテーブルがあります。格納されるデータの性質により、これらのフィールドの一部に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」を使用する以外に、私の選択肢は何ですか?

53
simbabque

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に異なるタイプのインデックスを作成できます。

45
Girish Rao

主キーは、列を一意かつnull以外にするために使用されます

Null値を挿入して挿入するには、field2をniqueとして作成します

一意制約により、フィールドは重複を削除しますが、null値を許可します

23
Lordferrous

主キーは、列にNULL値があってはならないことを示しています。そのため、複合主キーの定義に使用される列はNULLにはなりません。

また、Oracleサーバーは、複合主キー定義で使用されるすべての列の組み合わせを比較します。すべての列の既存データ(x、yなど)が新しく追加された行と一致した場合、一意制約違反のエラーが発生します。

さらに、このスレッドを見てください: 複合主キーのヌル可能列の何が問題になっていますか? .

このリンクは、複合キーのNULLABLE列の可能性に関する貴重な情報を提供します!

7
vijay

一意のキーを使用できます。このリンクをご覧ください。null値で機能します

http://www.xaprb.com/blog/2009/09/12/the-difference-between-a-unique-index-and-primary-key-in-mysql/

3
jcho360

次のような一意のキーを使用できます。

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)
3