72

主キーを構成するいくつかの列を持つテーブルがあります。格納されるデータの性質により、これらのフィールドの一部に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 にすることができないためですか? たとえば、「0」を使用する以外に、私の代替手段は何NULLですか?

4

5 に答える 5

65

MySQLのドキュメントから:

主キー

すべてのキー列を NOT NULL として定義する必要がある一意のインデックス。それらが明示的に NOT NULL として宣言されていない場合、MySQL はそれらを暗黙的に (そしてサイレントに) 宣言します。テーブルは、1 つの PRIMARY KEY のみを持つことができます。PRIMARY KEY の名前は常に PRIMARY であるため、他の種類のインデックスの名前として使用することはできません。

https://dev.mysql.com/doc/refman/8.0/en/create-table.html

Field2 が NULL になる可能性がある場合、すべての行で Field1 を区別する必要があるため、主キーの一部としてそれが必要な理由を疑問に思います。そのため、Field1 だけで主キーとして十分なはずです。Field2 に別の種類のインデックスを作成できます。

于 2012-06-12T17:06:35.233 に答える
31

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

NULL 値を挿入するには、field2 をUNIQUEにします。

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

于 2015-05-06T09:40:21.647 に答える
8

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

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

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

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

于 2012-06-12T18:28:03.137 に答える
7

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

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)
于 2014-08-20T12:32:14.247 に答える
3

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

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

于 2012-06-12T17:08:16.343 に答える