ERROR 1292 (Truncated incorrect INTEGER value: 'd3ea87d0c34cce2260b260b968897787 ?

pilot911

Новичок
ERROR 1292 (Truncated incorrect INTEGER value: 'd3ea87d0c34cce2260b260b968897787 ?

Мускуль 5.1 выдает ошибку на этой структуре таблицы


[SQL]
CREATE TABLE `be_session` (
`id` char(32) NOT NULL DEFAULT '',
`ses_name` char(32) NOT NULL DEFAULT '',
`ses_userid` int(10) unsigned NOT NULL DEFAULT '0',
`ses_tstamp` int(10) unsigned NOT NULL DEFAULT '0',
`uc_ses` blob,
`ses_iplock` char(40) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `ses_userid` (`ses_userid`,`id`,`ses_tstamp`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

[/SQL]



[SQL]

INSERT INTO be_session
(
id,
ses_userid,
ses_name,
ses_tstamp,
ses_iplock
) VALUES (
'd3ea87d0c34cce2260b260b968897787',
1,
'be_user_session',
1238602880,
'127.0.0.1'
) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id),
id='d3ea87d0c34cce2260b260b968897787',
ses_userid=1,
ses_name='be_user_session',
ses_tstamp=1238602880,
ses_iplock='127.0.0.1'

[/SQL]


почему это происходит ?
 

vovanium

Новичок
А что оно по-твоему должно делать?
По-моему LAST_INSERT_ID() работает с полями auto_increment
 

pilot911

Новичок
Так запрос отрабатывается:

[SQL]UPDATE be_session SET

id='d3ea87d0c34cce2260b260b968897787',
ses_userid=1,
ses_name='be_user_session',
ses_tstamp=1238602880,
ses_iplock='127.0.0.1'

WHERE id='d3ea87d0c34cce2260b260b968897787'[/SQL]
 

vovanium

Новичок
Так запрос отрабатывается:
Еще раз повторяю, LAST_INSERT_ID() предназначен для полей AUTO_INCREMENT

И зачем ты в update присваиваешь значение id, если id у тебя не меняется?
 

pilot911

Новичок
Автор оригинала: vovanium
Еще раз повторяю, LAST_INSERT_ID() предназначен для полей AUTO_INCREMENT

И зачем ты в update присваиваешь значение id, если id у тебя не меняется?
это необходимо для получения ID измененной записи, поскольку на mysql.com прочитал такую заметку

Regarding the trick for making LAST_INSERT_ID() well defined for updates:

INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;

This does not work if nothing changes, presumably because MySQL doesn't run the dummy update at all then. I.e. if there is an existing record with 3 in column c then LAST_INSERT_ID() still won't return the AUTO_INCREMENT id afterwards.

это баг важен, когда после INSERT INTO....ON DUPLICATE KEY UPDATE необходимо получить ID (через mysql_insert_id($link) ) той записи, которую изменили/добавили...поэтому приходится писать так

[sql]
ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID( id ) ,
id = 'd3ea87d0c34cce2260b260b968897787',
[/sql]
 

vovanium

Новичок
Капец, ты тупишь по полной, даже там написано что поле должно быть AUTO_INCREMENT, а AUTO_INCREMENT поля имеют тип INTEGER, потому и матерится мускул, потому что пытается из твоего md5 сделать INTEGER...

необходимо получить ID той записи, которую изменили/добавили...поэтому приходится писать так
id ты и так знаешь он у тебя в запросе несколько раз указывается. LAST_INSERT_ID нужен когда ты не знаешь id, создающийся по AUTO_INCREMENT.

-~{}~ 01.04.09 20:29:

vovanium
необходимо получить ID (через mysql_insert_id($link) ) той записи
Вот интересно, а что после того как ты выполняешь запрос в котором дважды указываешь id, твой скрипт резко забывает id, который только что вставил в запрос?
 

pilot911

Новичок
Автор оригинала: vovanium
Капец, ты тупишь по полной, даже там написано что поле должно быть AUTO_INCREMENT, а AUTO_INCREMENT поля имеют тип INTEGER, потому и матерится мускул, потому что пытается из твоего md5 сделать INTEGER...
эту тему счас исследую.. как-то полгода система работала

id ты и так знаешь он у тебя в запросе несколько раз указывается. LAST_INSERT_ID нужен когда ты не знаешь id, создающийся по AUTO_INCREMENT.
в запросе указывается, однако я хочу иметь простую функцию получения последнего ID в любом месте кода... предлагаешь ID хранить глобально ? :)

повторюсь, два раза ID указывается для того, чтобы после INSERT INTO ... ON DUPLICATE KEY всегда возвращался ID независимо от того, была ли вставка или апдейт... потому что при стандартной записи в случае апдейта ID вернется как 0
 

pilot911

Новичок
Автор оригинала: vovanium
А тебе религия запрещает переменные создавать?
можно в объекте, работающем с БД

еще вопрос:

допустим, выполнил запрос на вставку и хочу узнать результат и ID

сейчас делаю так (упрощенно)


mysql_query(...);

if (mysql_affected_rows()) {
$id = mysql_insert_id();
}


если в mysql_query проиходит ошибка, насколько я понимаю, mysql_affected_rows возвращает 0 ?
 

svetasmirnova

маленький монстрик
Какая точная версия MySQL? ОС какая?

-~{}~ 01.04.09 22:14:

Ааа, поняла - там уже есть такая строка.

А зачем LAST_INSERT_ID( id ), а не LAST_INSERT_ID( )?
 

pilot911

Новичок
phpinfo () : client API 4.1.15 ... может из-за этого ?


select version(): 5.1.32-community
 

флоппик

promotor fidei
Команда форума
Партнер клуба
vovanium, вообще говоря, он как ни странно, прав, имхо. (с точки зрения написанной документации)
Ибо:
Если задано значение аргумента expr в функции LAST_INSERT_ID(), то величина аргумента возвращается функцией и устанавливается в качестве следующего значения, которое будет возвращено функцией LAST_INSERT_ID(). Это можно использовать для моделирования последовательностей
Т.е. автоинкремент для этого как таковой - не нужен. Другой вопрос - что в нутрях. Но это думаю нам скажет Света :)
То что он одинаковые значения передает, я вижу. Но проблема то как раз в конвертации! )

ЗЫ. Кстати 5.1.28-rc-community все также.
--
*слава ораклу, в котором нет этих идиотских одиночных допущений, типа всяких автоинкрементов ;)*
 

pilot911

Новичок
Автор оригинала: svetasmirnova

А зачем LAST_INSERT_ID( id ), а не LAST_INSERT_ID( )?
потому что при апдейте просто LAST_INSERT_ID( ) вернет 0, а при LAST_INSERT_ID( id ) mysql_insert_id всегда будет возвращать правильный ID (это касается синтаксиса ON DUPLICATE KEY)
 

Mols

Новичок
Автор оригинала: pilot911
допустим, выполнил запрос на вставку и хочу узнать результат и ID
Что значит "хочу узнать" ID?
Если запрос без ошибок знач всё прошло норм. А ID и так известен. Он же в запросе явно указан.
 

pilot911

Новичок
Автор оригинала: Mols
Что значит "хочу узнать" ID?
Если запрос без ошибок знач всё прошло норм. А ID и так известен. Он же в запросе явно указан.
как узнать, что запрос прошел без ошибок на все 100% ?

для INSERT, UPDATE, DELETE я это делаю через mysql_affected_rows() - насколько правильно ?

то есть вопрос в том, не вернет ли mysql_affected_rows() результат позапрошлого запроса, который был правильным... а не послднего, который с ошибкой ?
 
Сверху