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

Как мне создать ключ уникального значения в паре с моим _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 и заканчивая запись ^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 голосов
/ 19 октября 2010

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

use Digest::MD5 qw(md5_hex);

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

печать:

a9959dc27c0bac23be48686ceaa1683c

2 голосов
/ 20 октября 2010

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

1 голос
/ 19 октября 2010

Если вы хотите придерживаться своей схемы, ваш цикл 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).

1 голос
/ 19 октября 2010

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

1 голос
/ 19 октября 2010

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

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

0 голосов
/ 20 октября 2010

Что это за номер записи?Почему он должен быть уникальным?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";
    }

Хотя вы не сказали много об ограничениях вашей проблемы.

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