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
?
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.
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
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!
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/
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)