2010-06-06 3 views
3

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

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

Так что для следующей таблице:

ID (Auto) | Field_A | Field_B | Field_C 

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

Как предотвратить такое поведение?

ответ

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) 
); 

Другой альтернативой является добавление unique constraint (MySQL implements them as an index):

CREATE UNIQUE INDEX blah_ind USING BTREE ON your_table(field_a, field_b) 
+1

Связанных : http://forums.mysql.com/read.php?22,264498,264967#msg-264967 –

+0

Мне удалось создать индекс в моем поле auto, а затем удалить первичный ключ. Затем я назначил поля A, B и C первичными, как предложено. Большое спасибо! – pws5068

+0

@ pws5068: Имейте в виду, что это позволит дублировать 'field_c' для каждой уникальной пары' field_a' и 'field_b'. –