2013-04-10 2 views
0

Я делаю запрос к базе данных mysql.Значения NULL в запросе mysql - версии имеют значение?

Существует столбец под названием source со значением по умолчанию NULL, используемым для тегов удаленных данных.

На моем сервере dev я использовал запрос, например DELETE FROM mytable WHERE source - это прекрасно работает и удаляет все строки со значением в source.

На реальном сервере этот запрос не удаляет любые строки. Я предполагаю, что мне нужно использовать DELETE FROM mytable WHERE source IS NOT NULL.

Однако, кажется странным, что было бы различие в том, как mysql обрабатывает значения NULL. Это поведение зависит от версии mysql? Или мне нужно искать другую причину отказа этого запроса на реальном сервере?

+0

Обычно говорят: 'УДАЛИТЬ ОТ x WHERE y = z', а не' WHERE y'. – tadman

+0

Почему вы не делаете 'SELECT' на обоих и сравниваете результаты. – Kermit

+0

@tadman Ничего необычного в отношении 'WHERE y' – Kermit

ответ

0
DELETE FROM mytable WHERE source 

и

DELETE FROM mytable WHERE source is not null 

две совершенно разные вещи, из-за обработки сломанный выражение в MySQL.

Если source - числовой столбец (целочисленный, десятичный, ..), первый будет удалять все строки с source больше нуля.

Для примера смотрите здесь: http://sqlfiddle.com/#!2/87325/1

Если source это символьное значение, MySQL попытается преобразовать содержимое в число, если это работает строка будет удалена, если это число больше нуля.

Смотрите здесь для примера: http://sqlfiddle.com/#!2/5ebad/1

Причина (по существу, сломана) первый запрос работает на одной базе данных, а не на другой, возможно, придется делать со значениями в столбце.

+0

@ a_horse_with_no_name-- спасибо! Это очень полезная информация. Нечетная часть состоит в том, что данные в столбце должны быть одинаковыми в обеих базах данных, поскольку они по сути являются дубликатами - только сервер отличается от версии mysql. – user101289

0

Почему вы пишете заявления с потенциально неоднозначными условиями?
Я предлагаю вам всегда писать полные условия в запросах MySQL:

DELETE FROM mytable WHERE source IS NULL; 
DELETE FROM mytable WHERE source=0; /* and so on */ 

Это делает код более понятным, и вы менее склонны делать ошибки.
Я рекомендую делать то же самое при написании кода на других языках.

+0

@ Jocelyn-- причина в том, что есть нет установленного значения для 'source' - это может быть в принципе что угодно. Поэтому в этом случае 'IS NOT NULL' будет более правильным способом написать запрос, я просто не уверен, почему он работает на одном БД, но не в другом. – user101289

Смежные вопросы