Valeur nulle dans la clé primaire à plusieurs colonnes

j'ai une table avec plusieurs colonnes qui composent la clé primaire. La nature des données stockées permet à certains de ces champs d'avoir NULL valeurs". 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, quand j'exécute describe test il 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 continue à avoir une erreur en insérant une valeur NULL .

colonne "Field2" ne peut être nul

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

41
demandé sur Jaap 2012-06-12 21:02:04

5 réponses

à Partir de la documentation de MySQL :

une clé primaire est un index unique où toutes les colonnes clés doivent être définies comme non nulles. S'ils

ne sont pas explicitement déclarés comme non nuls, MySQL Les déclare de manière implicite (et silencieuse). Une table ne peut avoir qu'une seule clé primaire. Le nom D'une clé primaire est toujours primaire, ce qui il ne peut donc pas être utilisé comme nom pour un 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 comme partie de la clé primaire puisque vous avez alors besoin de Field1 pour être distinct à travers toutes les lignes. Donc Field1 en soi devrait être suffisant comme clé primaire. Vous pouvez créer un type différent d'index sur Field2.

36
répondu Girish Rao 2012-11-26 00:18:39

les touches primaires sont utilisées pour rendre la colonne à la fois unique et non nulle

Afinde pour insérer insérer des valeurs null faire champ2 Uniques

contrainte Unique faire sur le terrain supprime les doublons mais de permettre de null valeurs

22
répondu Lordferrous 2015-05-06 09:40:21
La clé primaire

indique que la colonne ne doit pas avoir les valeurs NULL . Ainsi les colonnes utilisées pour définir la clé primaire composite ne vont pas être NULL .

aussi Oracle server compare la combinaison de toutes les colonnes utilisées dans une définition de clé primaire composite. Si vos données existantes de toutes les colonnes (disons x,y) correspondent avec une nouvelle ligne d'ajout, cela soulèvera une erreur de contrainte unique violée.

d'Ailleurs,regardez ce fil: Ce qui est faux avec les colonnes nulles dans les clés primaires composites? .

ce lien fournit des informations précieuses concernant la possibilité de colonnes nulles en clé composite!

7
répondu vijay 2017-05-23 12:34:45

vous pouvez utiliser des Clés uniques, s'il vous plaît jeter un oeil à ce lien, ils 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
répondu jcho360 2012-06-12 17:08:16

vous pouvez utiliser la clé unique comme ceci:

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
répondu Dmitry Kaigorodov 2014-08-20 12:32:14