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
?
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.
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
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!
vous pouvez utiliser des Clés uniques, s'il vous plaît jeter un oeil à ce lien, ils fonctionnent avec des valeurs nulles
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)