2010-07-27 42 views
1

我正在读取每行包含一条记录的文件。我正在提取文件的内容并将其作为列值插入到表中。我面对的问题是,假设如果我从文件读取后向表中插入记录,我想删除重复的字段。例如:如何在使用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

+0

请包括您在描述的每种情况下用于写入数据库的代码。 – Ether 2010-07-27 06:42:11

+0

另请参阅上一个问题http:// stackoverflow。COM /问题/ 3334644 /怎么办,我到保持最值一列器唯一在MySQL的 - 的 - – daxim 2010-07-27 06:44:16

+0

我$ TEST11(排序键%可见){ 我的$测试1 = $见过{$ TEST11} { '名'}; my $ test2 = $ seen {$ test11} {'pid'}; my $ test3 = $ see {$ test11} {'type'}; my $ test4 = $ seen {$ test11} {'time1'}; print“$ test11 \ t $ test1 $ test2 $ test3 $ test4 \ n”; } #sub query_execute() { $ db_handle =&getdb_handle; $某物= $ dbh->制备( “INSERT INTO tahle_new值( '$ SNO', '$ ID', '$ TEST1', '$ TEST4', '$ TEST2', '$ TEST3')”); – Sreeja 2010-07-27 06:49:47

回答

2

每一行都必须为每列有一些值。你想要什么,否则将重复为NULL?很难想象这种桌子的实际用途。

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

+0

注意,这是不检测的DUP最有效的方式,但简单做,如果做得正确应防止竞争条件。 – ysth 2010-08-02 17:11:44

4

另一种方法是在2列上定义唯一的密钥。你的钥匙将是(姓名,年龄)和独特的。 所以在插入,你会得到一个错误,或添加到您的请求:“......对重复KEY ...”,做一些事情(或者什么也不做;))

而作为YSTH说,我会建议你不要插入带空值的行作为第二行(null,null,12:21)

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); 

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

+0

我没有说他/他不应该有空值;我说很难想象一个这样的情况,那就是想要的。实际上,我是希望能引起一些说,真正的问题是后来当数据从数据库输出读取... :) – ysth 2010-07-27 17:00:50

+0

@sreeja:与查询检索数据库中存储的数据:为了扩大这方面的更多一点。所以你可能会想要提出一个查询,列出所有'name'是'Tom'的'时间'。通过将重复数据“NULL”化,你失去了这种能力(或者变得非常困难)。而是使用[规范化](https://en.wikipedia.org/wiki/Database_normalization)进行重复数据删除,即将我们的常用值分解为单独的表格。现在你的查询变成了连接:它们结合了两张表中的行。这就是如何使用关系数据库的原因。 – reinierpost 2017-08-28 21:19:14

相关问题