MySql, InnoDB и нулевые значения

Раньше я использовал механизм хранения MyISAM для MySql, и я определил комбинацию трех полей как уникальную.

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

Итак, для следующей таблицы:

ID (Auto) |  Field_A   | Field_B  | Field_C

Я могу вставлять (Field_A,Field_B,Field_C) Values(1,2,NULL) (1,2,NULL) (1,2,NULL) бесконечно много раз.

Как я могу предотвратить такое поведение?


person pws5068    schedule 06.06.2010    source источник


Ответы (1)


Зависит от бизнес-правил, но первая идея состоит в том, чтобы установить field_a и field_b в качестве первичного ключа для таблицы. Столбец AUTO_INCREMENT можно использовать для столбца, не являющегося первичным ключом, но атрибут ключа должен быть связан со столбцом auto_increment:

CREATE TABLE your_table (
  ID int auto_increment not null,
  Field_A VARCHAR(45),
  Field_B VARCHAR(45),
  Field_C VARCHAR(45),
  key(ID), --without this, you'll get MySQL ERROR #1075
  primary key(field_a, field_b)
);

Другой альтернативой является добавление уникального ограничения (MySQL реализует их как индекс):

CREATE UNIQUE INDEX blah_ind USING BTREE ON your_table(field_a, field_b)
person OMG Ponies    schedule 06.06.2010
comment
Мне удалось создать индекс в моем автоматическом поле, а затем удалить первичный ключ. Затем я назначил поля A, B и C первичными, как было предложено. Большое спасибо! - person pws5068; 06.06.2010
comment
@ pws5068: Имейте в виду, что это позволит дублировать field_c для каждой уникальной пары наборов field_a и field_b. - person OMG Ponies; 06.06.2010
comment
Вы совершенно правы, это мое намерение в данном случае. Еще раз спасибо. - person pws5068; 06.06.2010