MySQL current_insert_id ()? (Не last_insert_id ()) - PullRequest
3 голосов
/ 17 мая 2009

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

Я знаю, что могу вставить его, извлечь insert_id, вычислить хэш и обновить его.

Кто-нибудь знает способ сделать это в одном запросе? Вам понадобятся строки insert_id во время вставки. Это абсолютно невозможно, или есть что-то вроде current_insert_id () ...

Спасибо!

Ответы [ 4 ]

11 голосов
/ 17 мая 2009

Нет, в MySQL нет функции, которая дает вам current_insert_id().

Единственный способ получить сгенерированное значение идентификатора из поля AUTO_INCREMENT в MySQL - это сделать INSERT и затем вызвать last_insert_id(). Таким образом, ваш план создания отдельного ОБНОВЛЕНИЯ для вычисления хеша, вероятно, вам придется сделать.

Я могу подумать о двух других альтернативах:

  • Создайте уникальное значение самостоятельно перед ВСТАВКОЙ с помощью другого механизма, кроме AUTO_INCREMENT. Например, см. Функцию UUID().

    SET @id = SELECT UUID();
    INSERT INTO MyTable (id, hash) VALUES (@id, hash(@id...));
    
  • Не включайте идентификатор в расчет хеша.

2 голосов
/ 17 мая 2009

Я не знаю, как сделать это в MySQL одним запросом, но вы можете сделать что-то подобное на своем языке сценариев на стороне сервера:

<?php

$query = mysql_query("SHOW TABLE STATUS LIKE 'MyTable'");
$row = mysql_fetch_assoc($query);
$next_id = $row['Auto_increment'];

?>

... который дает вам идентификатор для включения в ваш SQL.

РЕДАКТИРОВАТЬ: Я также нашел этот ответ , который может быть полезным.

1 голос
/ 17 мая 2009

Вы можете запросить следующее используемое значение из таблицы information_schema. TABLES, столбец AUTO_INCREMENT там. (Возможно, вы настраиваете себя на состояние гонки?)

0 голосов
/ 17 мая 2009

Когда я делаю вставки, я делаю что-то вроде этого:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...