|   |   | 
| 
 | Получение ID свежесозданной записи в базе MySQL | ☑ | ||
|---|---|---|---|---|
| 0
    
        V_V_V 17.02.14✎ 13:35 | 
        Не силен в MySQL, прошу помощи.
 Нужно получить значение поля ID свежесозданной записи в базе MySQL. До сих пор работало так: RecordSet = Новый COMОбъект("ADODB.RecordSet"); RecordSet.Open("SELECT * FROM " + ЛогинСМС, Соединение, 2, 3); RecordSet.AddNew(); RecordSet.Fields("number").Value = НомерСМС; RecordSet.Fields("sign").Value = ПодписьСМС; RecordSet.Fields("message").Value = СообщениеСМС; RecordSet.Fields("send_time").Value = ВремяСМС; RecordSet.Fields("wappush").Value = ВАПСсылка; RecordSet.Update(); ИДЗаписи = RecordSet.Fields("id").Value; RecordSet.Close(); RecordSet = ""; Возврат ИДЗаписи; Но поскольку записей в базе уже больше 50К, каждое обращение "SELECT * FROM" сильно грузит принимающую сторону (взвыла техподдержка). Набросал тестовое решение, но не знаю как из него получить ID. ТекстЗапроса = "INSERT INTO `" + ЛогинСМС + "` (`number`, `sign`, `message`) |VALUES |('" + НомерСМС + "', '" + ПодписьСМС + "', '" + СообщениеСМС + "') |"; Попытка Соединение.Execute(ТекстЗапроса); Исключение КонецПопытки; Попалась информация о "SELECT LAST_INSERT_ID()" вот здесь v8: 1С-> MySql Как получить ID вновь вставленной записи в MySQL? - но не осилил как эту функцию правильно прикрутить к своему запросу. | |||
| 1
    
        shuhard 17.02.14✎ 13:41 | 
        (0) что мешает использовать "SELECT Max(Id) FROM ..." ?     | |||
| 2
    
        Torquader 17.02.14✎ 13:43 | 
        Там где-то есть возможность получения последнего выданного ID.     | |||
| 3
    
        V_V_V 17.02.14✎ 13:43 | 
        (1) Отсутствие знаний. После такой выборки RecordSet.AddNew() и дальше отработает нормально? Я не перезапишу последнюю запись?     | |||
| 4
    
        V_V_V 17.02.14✎ 13:47 | 
        (1) Просто мне второй запрос показался более корректным при массовом добавлении новых записей. Он вообще ничего не выбирает по ходу. Вот его бы и хотелось поэксплуатировать.     | |||
| 5
    
        V_V_V 17.02.14✎ 13:52 | 
        (1) А, я неправильно понял где именно использовать "SELECT Max(Id) FROM ...". Сейчас попробую...     | |||
| 6
    
        Jaap Vduul 17.02.14✎ 14:18 | 
        (5)
 Если вставка осуществялется из разных сессий, то рискуете получить чужой ID. LAST_INSERT_ID() это то что вам и нужно. | |||
| 7
    
        Serginio1 17.02.14✎ 14:20 | 
        Ну можешь в пакетном запросе вернуть 
 http://blog.nagaychenko.com/2011/03/11/%d0%be%d1%81%d0%be%d0%b1%d0%b5%d0%bd%d0%bd%d0%be%d1%81%d1%82%d0%b8-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%8b-last_insert_id-%d0%b8-auto_increment-%d0%b2-mysql/ Либо в той же сессии Обратиться к SELECT LAST_INSERT_ID()" http://www.sql.ru/forum/554045/snova-last-insert-id | |||
| 8
    
        V_V_V 17.02.14✎ 14:43 | 
        (6) Сессия одна по идее - мое фоновое задание.
 На данный момент нагородил следующее: Command = Новый COMОбъект("ADODB.Command"); Command.ActiveConnection = Соединение; Command.CommandText = "SELECT Max(id) FROM " + ЛогинСМС; RecordSet = Новый COMОбъект("ADODB.RecordSet"); RecordSet = Command.Execute(); ИДЗаписи = RecordSet.Fields(RecordSet.Fields.Item(0).Name).Value; Самое смешное, что оно работает и выдает верный ИД. Может есть способ оптимизировать этот огород? | |||
| 9
    
        V_V_V 17.02.14✎ 14:44 | 
        (7) Спасибо, сейчас почитаю     | |||
| 10
    
        Jaap Vduul 17.02.14✎ 14:46 | 
        RecordSet = Соединение.Execute("SELECT LAST_INSERT_ID()");     | |||
| 11
    
        V_V_V 17.02.14✎ 15:03 | 
        (10) Другое дело. В сравнении с (8). Работает. Спасибо!
 Полный текст, на всякий случай: ТекстЗапроса = "INSERT INTO `" + ЛогинСМС + "` (`number`, `sign`, `message`) |VALUES |('" + НомерСМС + "', '" + ПодписьСМС + "', '" + СообщениеСМС + "') |"; Соединение.Execute(ТекстЗапроса); RecordSet = Соединение.Execute("SELECT LAST_INSERT_ID()"); ИДЗаписи = RecordSet.Fields(RecordSet.Fields.Item(0).Name).Value; | |||
| 12
    
        vlandev 17.02.14✎ 15:04 | 
        (8) Оптимизировать надо однозначно , так как функция MAX все записи перебирает. Надо типа как то так:
 SELECT id FROM ЛогинСМС ORDER BY id LIMIT 1 LAST_INSERT_ID не советую использовать. | |||
| 13
    
        Jaap Vduul 17.02.14✎ 15:05 | 
        ИДЗаписи = RecordSet.Fields(0).Value;     | |||
| 14
    
        V_V_V 17.02.14✎ 15:13 | 
        (13) Вообще замечательно. Громадное спасибо!
 (12) Я почитал в (7) о особенностях LAST_INSERT_ID - вроде бы не мой случай, поскольку я его получаю сразу после добавления записи и они у меня идут строго по наростанию. Или есть другие подводные камни? | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |