mysql null composite-primary-key

mysql - Valor NULL en clave principal de varias columnas



composite-primary-key (5)

Tengo una tabla con varias columnas que constituyen la clave principal. La naturaleza de los datos almacenados permite que algunos de estos campos tengan valores NULL . He diseñado mi mesa como tal:

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;

Sin embargo, cuando ejecuto describe test se muestra así:

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

Y sigo recibiendo un error al insertar un valor NULL .

La columna ''Field2'' no puede ser nula

¿Esto se debe a que un campo que es parte de una clave principal no puede ser nulo? ¿Cuáles son mis alternativas además de usar, digamos, ''0'' para NULL ?



De la documentación de MySQL:

Una PRIMARY KEY es un índice único donde todas las columnas clave deben definirse como NOT NULL. Si ellos
no están explícitamente declarados como NOT NULL, MySQL los declara de manera implícita (y silenciosa). Una tabla puede tener solo una PRIMARY KEY. El nombre de una LLAVE PRINCIPAL es siempre PRIMARIO, por lo que no se puede usar como nombre para ningún otro tipo de índice.

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

Si Field2 puede ser NULL, me pregunto por qué lo necesita como parte de la clave principal, ya que entonces necesita que Field1 sea distinto en todas las filas. Por lo tanto, Field1 por sí solo debería ser suficiente como la clave principal. Puede crear un tipo diferente de índice en Field2.


Puede usar una clave única como esta:

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)


Las claves primarias se usan para hacer que la columna sea única y no nula

Para insertar los valores nulos de inserción, haga que field2 sea único

Restricción única que hace que el campo elimine duplicados pero permita valores nulos


La clave principal indica que la columna no debe tener valores NULL . Por lo tanto, las columnas utilizadas para definir la clave primaria compuesta no serán NULL .

También el servidor Oracle compara la combinación de todas las columnas utilizadas en una definición de clave primaria compuesta. Si todos los datos existentes de las columnas (por ejemplo, x, y) coinciden con la fila de nueva adición, se generará un error de Violación única violada.

Además, mira este hilo: ¿Qué hay de malo con las columnas que aceptan nulos en las claves primarias compuestas? .

Este enlace proporciona información valiosa sobre la posibilidad de columnas NULLABLE en la clave compuesta.