MySQL current_insert_id()?(Не последний_insert_id())
-
22-08-2019 - |
Вопрос
Я вставляю строку со столбцом символов для хеша на основе (помимо прочего) автоматического идентификатора строки.
Я знаю, что могу вставить его, получить Insert_id, вычислить хэш и обновить его.
Кто-нибудь знает, как сделать это в одном запросе?Вам понадобятся строки Insert_id во время вставки.Это совершенно невозможно или есть что-то вроде current_insert_id()...
Спасибо!
Решение
Нет, в MySQL нет функции, которая бы давала вам current_insert_id()
.
Единственный способ получить сгенерированное значение идентификатора из AUTO_INCREMENT
поле в MySQL — выполнить INSERT, а затем вызвать last_insert_id()
.Итак, ваш план выполнения отдельного ОБНОВЛЕНИЯ для расчета хэша, вероятно, вам придется сделать.
Я могу придумать еще две альтернативы:
Создайте уникальное значение самостоятельно перед INSERT, используя какой-либо другой механизм, помимо
AUTO_INCREMENT
.Например, см.UUID()
функция.SET @id = SELECT UUID(); INSERT INTO MyTable (id, hash) VALUES (@id, hash(@id...));
Не включайте идентификатор в расчет хеша.
Другие советы
Я не знаю способа сделать это в MySQL одним запросом, но вы можете сделать что-то подобное на выбранном вами языке сценариев на стороне сервера:
<?php
$query = mysql_query("SHOW TABLE STATUS LIKE 'MyTable'");
$row = mysql_fetch_assoc($query);
$next_id = $row['Auto_increment'];
?>
... который дает вам идентификатор для включения в ваш SQL.
РЕДАКТИРОВАТЬ:я также нашел этот ответ что может быть полезно.
Вы можете запросить значение, которое будет использоваться следующим образом, из information_schema
.TABLES
стол, AUTO_INCREMENT
столбец там.(Возможно, вы настраиваете себя на состояние гонки?)
Когда я делаю вставки, я делаю что-то вроде этого:
INSERT INTO table (col1,col2) VALUES (data1,data2);SELECT LAST_INSERT_ID()
и просто запустите запрос, как будто я получаю данные.В VB.NET синтаксис (при условии, что у вас есть MySql.Data.MySqlClient.dll):
Dim sql As String = "[sql string above]"
Dim dr As MySqlDataReader = YourRetrieveDataFunction(sql)
dr.Read()
yourObjectInstance.ID = dr(0)
dr.Close
Технически это два запроса, но только одно попадание в базу данных :)