Значение NULL в многоколоночном первичном ключе
У меня есть таблица с несколькими столбцами, составляющими первичный ключ. Характер хранимых данных позволяет некоторым из этих полей иметь значения NULL
. Я разработал таблицу как таковую:
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;
Однако, когда я запускаю describe test
, он выглядит следующим образом:
|| *Field* || *Type* || *Null* || *Key* || *Default* || *Extra*
|| Field1 || smallint(5) unsigned || NO || PRI || ||
|| Field2 || decimal(5,2) unsigned || NO || PRI || 0.00 ||
И я получаю сообщение об ошибке при вставке значения NULL
.
Столбец 'Field2' не может быть null
Это потому, что поле, которое является частью первичного ключа, не может быть нулевым? Каковы мои альтернативы, кроме использования, скажем, "0" для NULL
?
Ответы
Ответ 1
Из документации MySQL:
PRIMARY KEY - уникальный индекс, где все ключевые столбцы должны быть определены как NOT NULL. Если они явно не объявлены как NOT NULL, MySQL объявляет их так неявно (и молча). В таблице может быть только один ПЕРВЫЙ КЛЮЧ. Имя ПЕРВИЧНОГО КЛЮЧА всегда ПЕРВИЧНО, таким образом, не может использоваться как имя для любого другого типа индекса.
http://dev.mysql.com/doc/refman/5.1/en/create-table.html
Если Field2 может быть NULL, я задаю вопрос, почему он вам нужен, как часть основного ключа, так как тогда вам нужно, чтобы поле1 было четким во всех строках. Поэтому Field1 сам по себе должен быть достаточным в качестве Первичного ключа. Вы можете создать другой тип индекса для поля2.
Ответ 2
Первичные ключи используются, чтобы сделать столбец как уникальным, так и не нулевым
Inorder для вставки вставляемых нулевых значений make field2 как Уникальный
Уникальное ограничение делает поле удаляет дубликаты, но допускает нулевые значения
Ответ 3
Основной ключ указывает, что столбец не должен иметь значения NULL
. Поэтому столбцы, используемые для определения составного первичного ключа, не будут NULL
.
Также сервер Oracle сравнивает комбинацию всех столбцов, используемых в определении составного первичного ключа. Если ваши все столбцы существующих данных (скажем, x, y) совпадают с новой добавочной строкой, это приведет к ошибке ошибки Unique Constraint Violated.
Кроме того, посмотрите на эту тему:
Что случилось с нулевыми столбцами в составных первичных ключах?.
Эта ссылка содержит ценную информацию о возможности столбцов NULLABLE в составном ключе!
Ответ 4
Вы можете использовать уникальный ключ следующим образом:
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)
Ответ 5
вы можете использовать уникальные ключи, пожалуйста, взгляните на эту ссылку, они работают с нулевыми значениями
http://www.xaprb.com/blog/2009/09/12/the-difference-between-a-unique-index-and-primary-key-in-mysql/