генерирование MD5 idHash непосредственно в операторе MySQL - PullRequest
5 голосов
/ 12 мая 2011

В моей таблице есть идентификатор пользователя, который автоматически увеличивается.В той же строке у меня есть idHash.Можно ли сгенерировать из него idHash (просто сумму MD5) напрямую с помощью той же инструкции INSERT, чтобы мне не пришлось ВЫБРАТЬ идентификатор, а затем ОБНОВИТЬ idHash снова?

Проблема заключается в следующем: Iне знаю userID до того, как он будет сгенерирован (автоматически увеличен) MySQL.

Спасибо, Фрэнк

PS: я использую PHP.PPS: Этот вопрос все о одиночной вставке.Я знаю, что могу использовать PHP или другие языки, чтобы вручную выбрать данные и затем обновить их.

Ответы [ 5 ]

1 голос
/ 12 мая 2011

Я не верю, что вы можете сделать это в одном выражении INSERT.

Что вы, вероятно, могли бы сделать, это использовать триггер INSERT, который определяет новый идентификатор,хеширует его, и затем обновляет запись.

0 голосов
/ 12 мая 2011

Мне кажется, это работает:

CREATE TABLE tbl (id INT PRIMARY KEY AUTO_INCREMENT, idHash TEXT);
INSERT INTO tbl (idHash) VALUES (MD5(LAST_INSERT_ID() + 1));
SELECT *, MD5(id) FROM tbl;

Обратите внимание, что это будет работать только для вставок из одной строки, так как LAST_INSERT_ID возвращает идентификатор вставки первой вставленной строки.

Выполнение MD5(column_name) для значения auto_increment не работает, так как значение еще не было сгенерировано, поэтому оно по сути вызывает MD5(0).

0 голосов
/ 12 мая 2011

AFAIK, в этом же запросе нет "безопасного" способа сделать это, если вы используете auto_increment.

Однако, если строки никогда не удаляются в вашей таблице, вы можете использовать этот маленький трюк:

insert into mytable (col1, col2, col3, idhash) 
values ('', '', '', md5(select max(id) from mytable))

Я не понимаю, почему вам нужно хешировать id, хотя, почемуне использовать id напрямую?

0 голосов
/ 12 мая 2011

Одно из решений, которое я могу порекомендовать, - использовать последний идентификатор вставки вместо повторного запроса к таблице.Вот упрощенный пример:

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$query = "INSERT INTO users VALUES (....)";
$mysqli->query($query);

$newUserID = $mysqli->insert_id;

$query = "UPDATE users SET idHash = MD5(userID) WHERE userID = $newUserID";
$mysqli->query($query);

/* close connection */
$mysqli->close();
?>
0 голосов
/ 12 мая 2011

Фрагмент PHP

<?
$tablename      = "tablename";
$next_increment     = 0;
$qShowStatus        = "SHOW TABLE STATUS LIKE '$tablename'";
$qShowStatusResult  = mysql_query($qShowStatus) or die ( "Query failed: " . mysql_error() . "<br/>" . $qShowStatus );

$row = mysql_fetch_assoc($qShowStatusResult);
$next_increment = $row['Auto_increment'];

echo "next increment number: [$next_increment]";
?>

Это даст вам следующее автоинкремент, а затем вы сможете использовать его в своей вставке.

Примечание: это не идеально (ваш метод несовершененпоскольку у вас фактически будет 2 первичных ключа)

От: http://blog.jamiedoris.com/geek/560/

...