SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 22.02.2011 14:56:14

frodo
Участник
Зарегистрирован: 22.02.2011
Сообщений: 3

InnoDB и NULL field в уникальном индексе

Есть таблица с уникальным индексом по нескольким полям, одно из которых внешний ключ на другую таблицу, причём оно может быть NULL. В таблицу пишутся данные через INSERT ... ON DUPLICATE KEY UPDATE ... .

Проблема в том, что если внешний ключ = NULL, то строка считается уникальной и происходит INSERT, а не UPDATE.

Нашел решение - пишу в поле с внешним ключём вместо NULL - 0. И создал соответствующую запись в таблице, на которую ссылается ключ. Но мне не нравится такое решение, есть ли более правильный путь?

Неактивен

 

#2 22.02.2011 15:51:37

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: InnoDB и NULL field в уникальном индексе

Вы просто неверно сформулировали условие уникальности. Вы хотите,
чтобы уникальными были все поля, кроме тех, которые NULL. Т.е. стол-
бец с NULL у Вас лишний в уникальном индексе smile

Неактивен

 

#3 22.02.2011 16:37:48

frodo
Участник
Зарегистрирован: 22.02.2011
Сообщений: 3

Re: InnoDB и NULL field в уникальном индексе

Я, видимо, плохо объяснил)

У меня таблица грубо говоря вида:

дата | внешний ключ 1 | внешний ключ 2 | значение

внешний ключ 2 может быть NULL, уникальность нужна по первым трём полям(дата, внешний ключ 1, внешний ключ 2) и значение с NULL почему-то всегда считается уникальным, в этом проблема. Т.е. с NULL возможно добавить две записи вида

2001-01-01 | 1 | NULL | 10
2001-01-01 | 1 | NULL | 23

это мешает мне при работе с INSERT ON DUPLICATE KEY UPDATE

Неактивен

 

#4 22.02.2011 17:10:11

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: InnoDB и NULL field в уникальном индексе

ok. А почему Вы считаете, что эти строки одинаковые? Какое число
скрывается за NULL? 1? 2? А почему Вы считаете, что так? Мне, напри-
мер, кажется, что в первой строке за NULL стоит 123, а во второй -17.

NULL — это не значение. Это место, куда можно вставить значение.
А вот если Вы потребуете кникальности первых двух полей, то будет
логичная структура.

Также, посмотрев на приведенный пример, у меня сложилось ощущение,
что у Вас просто не нормализована база, и поэтому у Вас возникают ло-
гические противоречия в структуре.

Да, и, наверное, отвечу прямо — NULL не значение, поэтому они всегда
разные, если их рассматривать как значения.

Неактивен

 

#5 22.02.2011 17:29:13

frodo
Участник
Зарегистрирован: 22.02.2011
Сообщений: 3

Re: InnoDB и NULL field в уникальном индексе

Ок, что-то такое и подозревал, понятно, спасибо за разъяснение. Сделаю третье поле NOT NULL и прицеплю к нему значение по умолчанию.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson