|
Получение 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 - вроде бы не мой случай, поскольку я его получаю сразу после добавления записи и они у меня идут строго по наростанию. Или есть другие подводные камни? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |