如何在我从MySQL获取的每条记录中为Perl创建一个唯一值?

时间:2010-10-19 18:18:09

标签: mysql perl

如何生成与我的_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

结束rec

我的样本数据表:

+------+------+------+
| 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 个答案:

答案 0 :(得分:3)

很难理解你想要做什么,所以我不能说在这里使用md5是否合适,但你可以用CPAN的Digest::MD5发行版来创建它们:

use Digest::MD5 qw(md5_hex);

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

打印:

  

a9959dc27c0bac23be48686ceaa1683c

答案 1 :(得分:2)

为什么不UUID() in MySQL?复制安全。

答案 2 :(得分:1)

我同意以太。您还可以在数据库中使用MD5()函数。但是,如果您的x_id不是唯一的,那么您必须使用其他一些值来制作MD5。 MD5需要从唯一数据开始。

如果您的x_id是唯一的,那么为什么还需要MD5?

答案 3 :(得分:1)

看一下Data :: UUID perl模块?

答案 4 :(得分: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)。

答案 5 :(得分:0)

这个记录号是多少?为什么它需要独一无二? x_id是唯一的吗?记录号值是否有任何格式,范围或其他要求?这个值是什么意思,还是只是一个独特的价值?

在这些情况下,我喜欢摆脱特殊情况。如果我需要一个与每条记录关联的唯一字符串,我让数据库为每条记录提供一个唯一的字符串。在数据库土地中,每条记录都应该有一个primary or unique key

 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";
    }

尽管如此,你对问题的限制并没有多说。