我正在读取一个包含每行记录的文件。我正在提取文件的内容并将其作为列值插入表中。我面临的问题是,假设我在读取文件后将记录插入表中,我想删除重复的字段。例如:
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 :(得分: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转义和安全问题。