SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 11.07.2008 11:52:59

Igor Panshin
Завсегдатай
Зарегистрирован: 04.06.2008
Сообщений: 62

Так ли это?

Пишу

UPDATE `dbo`.`dvsys_carddefs`
SET `Alias` = Alias , `Version` = Version , `SysVersion` = SysVersion , `LibraryID` = LibraryID ,
`ControlInfo` = ControlInfo , `Options` = ( Options & 0xFF00FFFF ) | ( `Options` & 0x00FF0000 ) ,
`FetchMode` = FetchMode , `XMLSchema` = XMLSchema , `XSDSchema` = XSDSchema , `Icon` = Icon

WHERE `dbo`.`dvsys_carddefs`.`CardTypeID` = CardTypeID;

и это работает правильно.

Пишу

UPDATE `dbo`.`dvsys_carddefs`
SET `Alias` = Alias , `Version` = Version , `SysVersion` = SysVersion , `LibraryID` = LibraryID ,
`ControlInfo` = ControlInfo , `Options` = ( Options & 0xFF00FFFF ) | ( `Options` & 0x00FF0000 ) ,
`FetchMode` = FetchMode , `XMLSchema` = XMLSchema , `XSDSchema` = XSDSchema , `Icon` = Icon

WHERE `CardTypeID` = CardTypeID;

и этот оператор в процедуре компилируется, но правильно не работает.

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

Так ли это? Или мое предположение ошибочно и я должен всегда указывать явно прямую принадлежность колонки?

Неактивен

 

#2 12.07.2008 01:24:26

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Так ли это?

В хранимых процедурах MySQL имена переменных подавляют имена колонок.

Т.е. если Вы пишите WHERE somename = somename, то MySQL в обоих случаях интерпретирует somename как имя переменной (внутри UPDATE tblname SET name1 = name2 name1 всегда интерпретируется как имя колонки, т.к. имя переменной там не может стоять просто синтаксически).

Когда Вы пишите в одном из имён внутри WHERE точку, не заключенную в обратные кавычки (`), это автоматически исключает отнесение этого имени к переменной, поскольку в процедурах имена переменных точек содержать не могут, и имя с точкой однозначно интерпретируется как указание на колонку таблицы.
Вот и получается такой результат.

Т.е. ответ на ваш вопрос: в таких случаях всегда нужно указывать имя колонки вместе с именем таблицы.

Вообще, четно говоря, информация неожиданная, не знал о такой возможности разрешения конфликтов имен; как-то они этот вопрос в документации не осветили..

Неактивен

 

#3 14.07.2008 09:45:49

Igor Panshin
Завсегдатай
Зарегистрирован: 04.06.2008
Сообщений: 62

Re: Так ли это?

Спасибо.

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

Неактивен

 

#4 14.07.2008 11:06:56

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Так ли это?

Вообще говоря, процедуры не компилируются в MySQL, а интерпретируются по ходу выполнения. В данном контексте переменная используется с приоритетом по отношению к имени колонки, поэтому формально это не ошибка, получается WHERE 2=2 (вместо обоих операндов подставлено одно и то же значение переменной).

Неактивен

 

#5 14.07.2008 13:28:30

Igor Panshin
Завсегдатай
Зарегистрирован: 04.06.2008
Сообщений: 62

Re: Так ли это?

Если быть более внимательным, то написана клауса

WHERE `CardTypeID` = CardTypeID;

а из нее получается WHERE `2`=2 , если я правильно понимаю, а вовсе не WHERE 2=2 ?
Или для движка, который интерпретирует код это все равно?

Так что это ошибка и формально тоже.

И потом мне что-то не верится, что интерпретируется прямо как написано. Явно есть промежуточный код иначе оптимизации не получишь без подготовки.

Неактивен

 

#6 14.07.2008 21:55:07

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Так ли это?

Обратные кавычки в MySQL не являются обычными кавычками, а используются, чтобы указать, что внутри них строковый идентификатор. Поэтому `имя_переменной` и имя_переменной - одно и то же, за икслючением использования в имени спецсимволов или совпадения имени с ключевым словом (в этих случаях вторая запись будет некорректной). Про промежуточный код ничего не слышал.

Неактивен

 

Board footer

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