Имя: Пароль:
1C
1С v8
Получение 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
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 - вроде бы не мой случай, поскольку я его получаю сразу после добавления записи и они у меня идут строго по наростанию. Или есть другие подводные камни?