在使用Perl插入表之前,如何检查表中的重复列值?

时间:2010-07-27 06:16:02

标签: mysql perl

我正在读取一个包含每行记录的文件。我正在提取文件的内容并将其作为列值插入表中。我面临的问题是,假设我在读取文件后将记录插入表中,我想删除重复的字段。例如:

NAME age time
Tom   21  10:30
Tom   21  12:21

插入表格后,我希望它是:

NAME AGE TIME
tom   21  10:30
          12:21

它应该消除重复。如果我在创建表时添加一个唯一的条件,我面临一个问题,即没有插入不同的时间字段,导致MySQL出错。

那我该怎么做呢?我想要一些建议。

for my $test11 (sort keys %seen) {
    my $test1 = $seen{$test11}{'name'};
    my $test2 = $seen{$test11}{'pid'};
    my $test3 = $seen{$test11}{'type'};
    my $test4 = $seen{$test11}{'time1'};
    print "$test11\t$test1$test2$test3$test4\n";
}

#sub query_execute()
{
    $db_handle = &getdb_handle;
    $sth       = $dbh->prepare("INSERT INTO tahle_new values('$sno','$id','$test1','$test4','$test2','$test3')");

$test1$test2包含重复但不包含$test3

3 个答案:

答案 0 :(得分:4)

另一种方法是在2列上定义唯一键。您的密钥将是(姓名,年龄)和唯一。 所以在插入时你会收到一个错误,或者添加到你的请求中:'... ON DUPLICATE KEY ...'并做某事(或什么也不做;)

正如 ysth 所说,我建议你不要插入你的空行作为第二行(null,null,12:21)

答案 1 :(得分:2)

每一行必须为每列提供一些值。你想要的是重复的是NULL吗?很难想象这样一张桌子的实际用途。

一种方法是为每个要与该列非重复的列建立另一个表作为唯一键;在将行添加到主表之前,尝试将列值添加到每个列表;如果存在重复错误,请在尝试添加到主表之前清除该值。

答案 2 :(得分:1)

ysth是正确的,你不应该有空值。复制表明您需要两个表。一个用于记录,另一个用于存储有关用户的信息。

CREATE TABLE user (
    id     INTEGER   NOT NULL PRIMARY KEY AUTO_INCREMENT,
    name   TEXT      NOT NULL,
    age    INTEGER
);

CREATE TABLE log (
    user   INTEGER REFERENCES user,
    time   TIME
);

日志表存储用户的整数id和时间(以及其他任何内容)。您将插入一个条目:

$dbh->do("INSERT INTO log VALUES (?,?)", undef, $uid, $time);

在记录日志中的条目之前,您必须记住或获取用户的ID。我建议不要使用名称作为键,因为它很容易改变。插入用户后,您可以使用$dbh->last_insert_id来获取该内容。请注意使用bind参数来避免SQL转义和安全问题。