web-dev-qa-db-fra.com

Valeur NULL dans la clé primaire à plusieurs colonnes

J'ai une table avec plusieurs colonnes constituant la clé primaire. La nature des données stockées permet à certains de ces champs d'avoir des valeurs NULL. J'ai conçu ma table comme telle:

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;

Cependant, lorsque je lance describe test cela montre comme ceci:

|| *Field* || *Type*                || *Null* || *Key* || *Default* || *Extra* 
|| Field1  || smallint(5) unsigned  || NO     || PRI   ||           ||         
|| Field2  || decimal(5,2) unsigned || NO     || PRI   || 0.00      ||         

Et je reçois toujours une erreur lors de l'insertion d'une valeur NULL.

La colonne 'Field2' ne peut pas être nulle

Est-ce parce qu'un champ qui fait partie d'une clé primaire ne peut pas être nul? Quelles sont mes alternatives à part, disons, "0" pour NULL?

53
simbabque

De la documentation MySQL:

Une CLÉ PRIMAIRE est un index unique où toutes les colonnes clés doivent être définies comme NON NUL. Si ils
ne sont pas explicitement déclarés comme NON NUL, MySQL les déclare implicitement (et silencieusement). Une table ne peut avoir qu'une seule CLÉ PRIMAIRE. Le nom d'une CLÉ PRIMAIRE est toujours PRIMAIRE, qui ne peut donc pas être utilisé comme nom pour tout autre type d'index.

http://dev.mysql.com/doc/refman/5.1/en/create-table.html

Si Field2 peut être NULL, je me demande pourquoi vous en avez besoin dans le cadre de la clé primaire, car vous avez alors besoin que Field1 soit distinct sur toutes les lignes. Donc, Field1 en soi devrait être suffisant comme clé primaire. Vous pouvez créer un type d'index différent sur Field2.

45
Girish Rao

Les clés primaires sont utilisées pour rendre la colonne unique et non nulle

Pour insérer des valeurs nulles d'insertion, faites champ2 comme nique

Une contrainte unique fait que le champ supprime les doublons mais autorise les valeurs nulles

23
Lordferrous

La clé primaire indique que la colonne ne doit pas avoir de valeurs NULL. Les colonnes utilisées pour définir la clé primaire composite ne seront donc pas NULL.

Le serveur Oracle compare également la combinaison de toutes les colonnes utilisées dans une définition de clé primaire composite. Si toutes les données existantes de vos colonnes (disons x, y) correspondent à la nouvelle ligne ajoutée, cela entraînera une erreur de contrainte unique violée.

De plus, regardez ce fil: Quel est le problème avec les colonnes nullables dans les clés primaires composites? .

Ce lien fournit des informations précieuses concernant la possibilité de colonnes NULLABLE dans la clé composite!

7
vijay

vous pouvez utiliser des clés uniques, veuillez consulter ce lien, elles fonctionnent avec des valeurs nulles

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

3
jcho360

Vous pouvez utiliser une clé unique comme celle-ci:

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
Dmitry Kaigorodov