2013-10-26 4 views
0

Есть ли способ сделать mysql хэш значениями автоматического приращения для его таблиц? Например, md5?Как хэш-автоинкремент в mysql

 
    id - name 
    1 - New York 
    2 - Chicago 
    3 - Sydney  
    4 - Berlin  

, что я пытаюсь получить

 
    id - name 
    c4ca4238a0b923820dcc509a6f75849b - New York 
    c81e728d9d4c2f636f067f89cc14862c - Chicago 
    eccbc87e4b5ce2fe28308fd9f2a7baf3 - Sydney  
    a87ff679a2f3e71d9181a67b7542122c - Berlin  

Заранее спасибо

EDIT:

Я думаю, что нужно прояснить этот вопрос немного больше, что им пытаются do не вызывают идентификаторы, а вставляют их. В тот момент, когда столбец идентификатора является полем int, которое я изменю на varchar.

Я хочу сохранить идентификаторы, поскольку хеширование в БД не вызывает их с помощью mysql SELECT. Благодаря

ответ

5

Если вам действительно нужно, по какой-то причине, вы можете достичь его с помощью отдельной таблицы для секвенирования и BEFORE триггер

Таблица схем:

CREATE TABLE table1_seq 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY); 
CREATE TABLE table1 
(id VARCHAR(32) NOT NULL DEFAULT 0, name VARCHAR(32)); 

Спусковой

DELIMITER $$ 
CREATE TRIGGER tg_bi_table1 
BEFORE INSERT ON table1 
FOR EACH ROW 
BEGIN 
    INSERT INTO table1_seq() VALUES(); 
    SET NEW.id = MD5(LAST_INSERT_ID()); 
END$$ 
DELIMITER ; 

Теперь вы можете вставлять строки в таблицу table1

INSERT INTO table1 (`name`) VALUES ('New York'),('Chicago'),('Sydney'),('Berlin'); 

или выберите

SELECT * FROM table1 WHERE id = MD5(2); 

Вот SQLFiddle демо

+0

Это поможет мне, спасибо за обмен! –

+0

вы можете проверить демонстрацию скрипки. его ничего не показывать –

+0

@KapilPaul это проблема на стороне sqlfiddle – peterm

1

MySQL Docs сказать ..

Функция не может быть добавлена ​​в качестве КОЛОННОГО УМОЛЧАНИЮ - за исключением сейчас(), что внутренне представлена ​​как синоним CURRENT_TIMESTAMP.

Лучший выбор должен был бы это сделать ...

UPDATE yourtablename SET id=MD5(id) WHERE 1=1; 

или запустить TRIGGER

Что-то вроде ... (не 100% правильно ... просто давая вам идею)

CREATE TRIGGER generateMD5forID BEFORE INSERT ON `yourtablename` FOR EACH ROW SET id = MD5(id); 
+0

К сожалению, в триггере BEFORE столбцу id не присвоено значение автоинкремента. Но слишком поздно менять его в триггере AFTER. Кроме того, вы не можете автоматически активировать VARCHAR-столбец, он должен быть одним из целочисленных типов. Но если это целое число, вы не можете сохранить в нем строку шестнадцатеричных цифр. –

+0

Спасибо, Билл. Ты прав. Вот почему я поставил это утверждение внутри курсива., Поскольку я не был уверен, что это действительно сработает. –

1

Ma ybe, я не понял вопроса, но это мое мнение:

Я думаю, вы пытаетесь создать хэш-таблицу. Поэтому вставьте поле id как хэш ваших данных (md5 (name)).

Но если нет, используйте триггер таблицы, чтобы генерировать хэш поля после вставки.

+0

Мне нравится идея использования уникальных полей для идентификатора типа md5 (name), но это означает, что мне нужно перепроектировать всю программу, и это будет стоить слишком много времени. Мне нравится идея триггера, но у меня нет такого опыта. Я буду экспериментировать с ним позже и попытаюсь совместить это с моей собственной сантехникой, размещенной здесь, если такая вещь возможна ... но в целом спасибо за ответ. –

0

Ответы здесь подняли Идею во мне .. Я думаю, что это будет лучшим решением на данный момент .. но если есть кто-то, кто знает более простой способ, я рад это слышать.

Решение:

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

0

Все ответы выше не имеют хорошее представление о необходимости использования хеширования идентификаторов.

Хеширование идентификатора auto increment нарушает всю концепцию. Концепция, которую вы хотите достичь, состоит в том, что следующий идентификатор будет непредсказуемым из предыдущего.

В идее хэширования id следующим идентификатором md5 (1) является md5 (2).

Если вы используете имена, которые помогают.

Лучше всего создать хэш из нескольких полей. Поля вместе должны быть уникальными для создания уникального хэша.

Смежные вопросы