Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Узнать ID при использовании ON DUPLICATE KEY
 
 автор: Eugene77   (27.09.2009 в 13:56)   письмо автору
 
 

Запрос примерно такой:

INSERT test SET t = 1
ON DUPLICATE KEY UPDATE
t = t + 1

Мне нужно узнать ID вставленой или изменённой записи.
Без ON DUPLICATE KEY UPDATE я знаю как делать
mysql_insert_id() - его отдаёт, а вот если используется ON DUPLICATE KEY UPDATE
как быть?

  Ответить  
 
 автор: cheops   (27.09.2009 в 14:51)   письмо автору
 
   для: Eugene77   (27.09.2009 в 13:56)
 

Собственно, как обычно, определяйте последнее значение ключа t через функцию MAX()
SELECT MAX(t) FROM test;

  Ответить  
 
 автор: Eugene77   (27.09.2009 в 15:10)   письмо автору
 
   для: cheops   (27.09.2009 в 14:51)
 

Хм, как-то ...
1) Может параллельный запрос подменить значение
2) Лишний запрос к таблице

Ну, если иначе никак...

  Ответить  
 
 автор: Valick   (27.09.2009 в 15:43)   письмо автору
 
   для: Eugene77   (27.09.2009 в 15:10)
 

расскажите подробнее зачем вам id ?

  Ответить  
 
 автор: Trianon   (27.09.2009 в 16:06)   письмо автору
 
   для: Eugene77   (27.09.2009 в 13:56)
 

Запрос INSERT ... ON DUPLICATE KEY UPDATE подразумевает изменение не первичного ключа (который, понятное дело, меняться не должен, потому что не должен меняться в принципе), а оставшихся полей записи. Среди них-то и можно выбрать поле, которым отмечать записи, подвергшиеся изменению посредством запроса.

  Ответить  
 
 автор: Eugene77   (28.09.2009 в 18:55)   письмо автору
 
   для: Trianon   (27.09.2009 в 16:06)
 

>Запрос INSERT ... ON DUPLICATE KEY UPDATE подразумевает изменение не первичного ключа (который, понятное дело, меняться не должен, потому что не должен меняться в принципе),

Это мне непонятно. Допустим, таблица пуста. Выполняем запрос. Разве mysql_insert_id() Не вернёт нам свеженькое значение первичного ключа?

а оставшихся полей записи. Среди них-то и можно выбрать поле, которым отмечать записи, подвергшиеся изменению посредством запроса.


Я добавил поле
`
float_timestamp` = mktime(1)

И использую его почти вместо первичного ключа.
По его значению можно найти как обновлённую, так и вновь вставленную строку.
Получилось дополнительное поле в таблице - чисто для технических нужд.
Это нормальная практика?

  Ответить  
 
 автор: cheops   (28.09.2009 в 19:00)   письмо автору
 
   для: Eugene77   (28.09.2009 в 18:55)
 

>Это мне непонятно. Допустим, таблица пуста. Выполняем запрос. Разве mysql_insert_id() Не
>вернёт нам свеженькое значение первичного ключа?
Нет, вы же ключ назначили - механизм auto_increment даже не начинал работать, поэтому и возвращать функции mysql_insert_id() не чего. Так будет в любом случае, даже без ON DUPLICATE KEY UPDATE.

  Ответить  
 
 автор: cheops   (28.09.2009 в 19:03)   письмо автору
 
   для: Eugene77   (28.09.2009 в 18:55)
 

>Это нормальная практика?
Собственно почему нет, нормальная практика, если обновленные и вставленные строки важно различать, а другие механизмы, в силу причин, не годятся.

  Ответить  
 
 автор: Trianon   (28.09.2009 в 21:06)   письмо автору
 
   для: Eugene77   (28.09.2009 в 18:55)
 

>float_timestamp` = mktime(1)
этой строки не понял.
>И использую его почти вместо первичного ключа.
Вы даже можете для обеспечения функциональности ON DUPLICATE KEY честно применять уникальный ключ, а не первичный. Как я понимаю первичность ключа - не есть требование.

  Ответить  
 
 автор: Eugene77   (29.09.2009 в 17:12)   письмо автору
 
   для: Trianon   (28.09.2009 в 21:06)
 

>>float_timestamp` = mktime(1)
>этой строки не понял.

Это каждый раз я так заполняю одно из полей строки (вставляемой или модифицированной)
Потом нахожу эту строку по значению этого поля.

>>И использую его почти вместо первичного ключа.
>Вы даже можете для обеспечения функциональности ON DUPLICATE KEY честно применять уникальный ключ, а не первичный. Как я понимаю первичность ключа - не есть требование.

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

  Ответить  
 
 автор: Trianon   (29.09.2009 в 22:20)   письмо автору
 
   для: Eugene77   (29.09.2009 в 17:12)
 

>>>float_timestamp` = mktime(1)
>>этой строки не понял.
>Это каждый раз я так заполняю одно из полей строки (вставляемой или модифицированной)

функции mktime(1) в стандартных я не нашел. Строка всё еще непонятна.

>Потом нахожу эту строку по значению этого поля.
>>>И использую его почти вместо первичного ключа.
>>Вы даже можете для обеспечения функциональности ON DUPLICATE KEY честно применять уникальный ключ, а не первичный. Как я понимаю первичность ключа - не есть требование.
>Не совсем понятно как на добиться чтобы в этом поле было действительно уникальное значение. Ни метка времени, ни случайное число уникальности не гарантируют

Так если Вы зададите в нем уникальное значение - никакого DUPLICATE не возникнет по определению.

  Ответить  
 
 автор: Eugene77   (30.09.2009 в 15:20)   письмо автору
 
   для: Trianon   (29.09.2009 в 22:20)
 

>
>функции mktime(1) в стандартных я не нашел. Строка всё еще непонятна.
Да, разумеется, простите, я имел в виду microtime(1)

>Так если Вы зададите в нем уникальное значение - никакого DUPLICATE не возникнет по определению.
Так у меня не получается потому что в этой таблице есть поля, которые естественным образом определяют уникальную строку. По ним и создан уникальный индекс.
Мой запрос делает именно то, что нужно, добавляя или модифицируя запись.
Мой вопрос только в одном:
Как потом обратиться именно к той записи с которой работал запрос?

Предпочтительно было бы получить её первичный ключ.

  Ответить  
 
 автор: Trianon   (30.09.2009 в 15:24)   письмо автору
 
   для: Eugene77   (30.09.2009 в 15:20)
 

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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования