Подтвердить что ты не робот

Значение 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?

4b9b3361

Ответ 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)