Как я могу создать уникальное значение в Perl для каждой записи, которую я получаю из MySQL?

0

Как я могу создать уникальный ключ значения для сопряжения с моим именем поля _rec_key_? Я создаю файл данных. Я искал использование значения MD5 в качестве ключа или любых других предложений, которые вы должны убедиться, что это уникально. Я не знаю, как извлечь это значение.

Формат файла должен выглядеть примерно так:

__rec_key__^amd5val^ex_id^a1^einum^a2609^euser^aJoe^e^d
__rec_key__^amd5val^ex_id^a2^einum^a2609^euser^aBob^e^d

В основном, вставляя значение с ^a и ^e и заканчивая rec с помощью ^d

Таблица наших данных:

+------+------+------+
| x_id | inum | user |
+------+------+------+
|    1 | 2608 | Joe  |
|    2 | 2609 | Bob  |
+------+------+------+

Мой код до сих пор - это... который только что выводит мой вывод без уникального значения md5. Мне нужно, чтобы значение было сопряжено с _rec_key_

my $data = '';
my $dbh = DBI->connect("DBI:mysql:test:localhost:3306");
my $sth = $dbh->prepare("select x_id, inum, user from mytest");
$sth->execute();
while (my($x_id, $inum, $user) = $sth->fetchrow_array() ) {
$data = $data. "__record_key__^a$x_id^e^a$inum^e^a$user^e^d";
}
$sth->finish;
$dbh->disconnect;
print $data;
Теги:

6 ответов

3
Лучший ответ

Трудно понять, что вы пытаетесь сделать, поэтому я не могу сказать, подходит ли использование md5 здесь, но вы можете создать их с помощью Digest:: MD5 от CPAN:

use Digest::MD5 qw(md5_hex);

my $data = 'some arbitrary data';
my $digest = md5_hex($data);
print $digest, "\n";

печатает:

a9959dc27c0bac23be48686ceaa1683c

  • 0
    для этой конкретной задачи да мне нужно значение типа md5. спасибо, я проверю этот дистрибутив.
  • 0
    или Digest :: SHA1 по этому вопросу search.cpan.org/~gaas/Digest-SHA1-2.13/SHA1.pm , или более гибкое использование объекта Digest и инициализация с выбранным вами алгоритмом
Показать ещё 1 комментарий
2

Почему бы не UUID() в MySQL? Также безопасна репликация.

  • 0
    хорошее предложение, спасибо за ваш совет. я тоже смотрю на это
1

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

И если ваш x_id уникален, то зачем вам нужен MD5?

1

Посмотрите на модуль данных Data:: UUID perl?

1

Если вы хотите придерживаться своей схемы, ваш цикл while неверен:

while (my($x_id, $inum, $user) = $sth->fetchrow_array() ) {
  $data = $data. "__record_key__^a$x_id^e^a$inum^e^a$user^e^d";
}

Это создаст очень длинную строку. Вам действительно нужна одна строка для каждого пользователя:

while (my($x_id, $inum, $user) = $sth->fetchrow_array() ) {
  my $data = "__record_key__^a${x_id}^e^a${inum}^e^a${user}^e^d";
  ...
}

Я также поместил скобки вокруг ваших имен переменных для ясности (т.е. ${user}^e^d вместо $user^e^d).

0

Что это за номер записи? Почему он должен быть уникальным? Является ли x_id уникальным? Есть ли какой-либо формат, диапазон или другие требования к значению номера записи? Значит ли значение что-либо или это просто уникальное значение?

В подобных случаях мне нравится избавляться от особых случаев. Если мне нужна уникальная строка, связанная с каждой записью, я даю базе данных дать каждой записи уникальную строку. В базе данных каждая запись должна иметь основной или уникальный ключ:

 CREATE TABLE (
       pk INT AUTO_INCREMENT PRIMARY KEY,
       ...
       );

Когда вы вставляете данные в эту таблицу, MySQL может выбрать для вас значение pk.

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

my $sth = $dbh->prepare("select pk, x_id, inum, user from mytest");
$sth->execute();

while (my($pk, $x_id, $inum, $user) = $sth->fetchrow_array() ) {
    $data = $data. "$pk^a$x_id^e^a$inum^e^a$user^e^d";
    }

Вы не много говорили о проблемах вашей проблемы.

  • 0
    Я тоже рассматриваю ваше предложение. Выглядит достаточно просто для реализации. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню