在Perl中使用DBI来更新一行中的多个字段?

时间:2014-09-27 07:44:51

标签: sql perl sqlite sql-update dbi

我对perl和SQL新手都很平庸,所以原谅任何跛脚。

我有一个我正在处理的perl脚本,它与数据库交互以跟踪IRC上的用户。从我发现的教程中,我已经能够创建数据库,在其中创建表,插入新记录,在该记录中更新字段,以及根据字段选择/查找记录。

问题是,我只能弄清楚如何一次更新一个字段,这似乎效率低下。

创建表格的代码:

my $sql = <<'END_SQL';
CREATE TABLE seenDB (
id       INTEGER PRIMARY KEY,
date    VARCHAR(10),
time    VARCHAR(8),
nick    VARCHAR(30) UNIQUE NOT NULL,
rawnick VARCHAR(100),
channel VARCHAR(32),
action  VARCHAR(20),    
message VARCHAR(380)
)
END_SQL

$dbh->do($sql);

使用我在别处确定的值插入记录:

$dbh->do('INSERT INTO seenDB (nick, rawnick, channel, action, message, date, time) VALUES (?, ?, ?, ?, ?, ?, ?)', undef, $nickString, $rawnickString, $channelString, $actionString, $messageString, $dateString, $timeString);

因此,当脚本需要更新时,我想立即更新所有这些恶魔,但是现在唯一可行的是一次一个,使用我从教程中获得的语​​法:

$dbh->do('UPDATE seenDB SET time = ? WHERE nick = ?',
 undef,
 $timeString,
 $nickString);

我为多个字段尝试了以下语法,但它们都失败了:

$dbh->do('UPDATE seenDB (rawnick, channel, action, message, date, time) VALUES (?, ?, ?, ?, ?, ?)', undef, $rawnickString, $channelString, $actionString, $messageString, $dateString, $timeString);

$dbh->do('UPDATE seenDB SET rawnick=$rawnickString  channel=$channelString   action=$actionString   message=$messageString   date=$dateString  time=$timeString WHERE nick=$nickString');

有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

您可以一次更新多个字段,其方式与更新单个字段几乎相同,只需在更新中列出逗号分隔,例如;

$dbh->do('UPDATE seenDB SET rawnick=?, channel=?, action=?, message=?, date=?, time=? WHERE nick=?',
    undef,
    $rawnickString,
    $channelString,
    $actionString, 
    $messageString,
    $dateString,
    $timeString,
    $nickString
);