Вопрос

Я вставляю строку со столбцом символов для хеша на основе (помимо прочего) автоматического идентификатора строки.

Я знаю, что могу вставить его, получить 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

Технически это два запроса, но только одно попадание в базу данных :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top