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

Column 'Field2' cannot be null

Это потому, что поле, являющееся частью первичного ключа, не может быть пустым? Каковы мои альтернативы, кроме использования, скажем, «0»? заNULL?

 Bob Stein31 мар. 2013 г., 17:40
Благодаря ссылке VJ Shah @Tomalak делаетexcellent point что это ограничение следует из основного принципа SQL, что, поскольку части первичного ключа должны сравниваться из каждой строки с каждой другой строкой, и & quot;NULL cannot be part of a comparison - the result of such a comparison would always be NULL& Quot; что для обеспечения уникальности первичного ключа требуются ненулевые столбцы.

Ответы на вопрос(5)

пожалуйста, посмотрите на эту ссылку, они работают с нулевыми значениями

http://www.xaprb.com/blog/2009/09/12/the-difference-between-a-unique-index-and-primary-key-in-mysql/

Для вставки пустых значений вставки сделайте field2 какUnique

Unique constraint make the field removes duplicates but allow null values

 simbabque26 апр. 2017 г., 19:22
@ singe3 хорошо, вопроса не былоhow do I create an index with a NULL value, ноwhy can I not have a NULL value in the primary key, Я рад, что информация о том, что уникальный ключ позволяет вам иметь поле NULL, помогла вам, но она не отвечает на вопрос. Принятый ответ делает.
 17 июн. 2015 г., 14:29
Это ответ на вопрос, спасибо. Принятый ответ был неверным.

NULL ценности. Таким образом, столбцы, используемые для определения составного первичного ключа, не будутNULL.

Также сервер Oracle сравнивает комбинацию всех столбцов, используемых в определении составного первичного ключа. Если во всех ваших столбцах существующие данные (скажем, x, y) совпадают с вновь добавляемой строкой, это вызовет ошибку «Уникальное ограничение нарушено».

Более того, посмотрите на эту ветку: Что не так с обнуляемыми столбцами в составных первичных ключах?.

Эта ссылка предоставляет ценную информацию относительно возможности столбцов NULLABLE в составном ключе!

 simbabque13 июн. 2012 г., 09:17
Спасибо за ваш вклад. Я не на Oracle, но на MySQL, хотя.

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)
Решение Вопроса

A PRIMARY KEY is a unique index where all key columns must be defined as NOT NULL. If they
are not explicitly declared as NOT NULL, MySQL declares them so implicitly (and silently). A table can have only one PRIMARY KEY. The name of a PRIMARY KEY is always PRIMARY, which thus cannot be used as the name for any other kind of index.

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

Если Field2 может быть NULL, я спрашиваю, зачем он вам нужен как часть первичного ключа, поскольку тогда вам нужно, чтобы Field1 был различим во всех строках. Таким образом, Field1 само по себе должно быть достаточно в качестве первичного ключа. Вы можете создать другой тип индекса на Field2.

 09 июл. 2014 г., 14:40
Я этого не вижу. Ясно, что Field1 - & gt; 5 и Field2 - & gt; null отличается от Field1 - & gt; 5 и Field2 - & gt; 3. Так что это может быть использовано для идентификации однозначно разных пар. Я нашел эту ветку после поиска в Google, потому что я в этой ситуации и не понимаю, почему я не могу использовать NULL в первичном ключе ...
 simbabque13 июн. 2012 г., 09:14
Это определение, которое я искал, но не нашел. Спасибо. На самом деле у меня сейчас 12 столбцов, которые составляют первичный ключ. 5 из этих значений обнуляются. Это стратегия кэширования, где не все значения необходимы в обналиченном запросе. Моя идея заключалась в том, что составные первичные ключи будут дешевле, чем использование значения автоинкремента в качестве PK и добавление уникального индекса для всех остальных. Похоже, я должен идти по этому пути.
 25 июн. 2014 г., 10:41
У меня та же проблема, мне нужно два столбца ПК с одним нулем. Этот столбец также является внешним ключом, который может ссылаться на другую таблицу. Без нулевой опции я должен установить его со значением, и он сломал внешний ключ.
 25 окт. 2013 г., 21:29
@Girish Я только что столкнулся с этой проблемой, и я также хочу иметь одно обнуляемое поле. В моем случае PK состоит из двух полей, одно из которых может иметь значение NULL, но мне нужно не более одной строки со вторым полем NULL, так что это должен быть действительный PK. ИМХО, это проваленная спецификация от MySQL.
 12 июн. 2012 г., 19:07
Удивительно, что он позволяет создать первичный ключ, используя столбец, который определен как принимающий нули.

Ваш ответ на вопрос