【发布时间】:2014-09-27 07:44:51
【问题描述】:
我对 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');
有没有更好的方法来做到这一点?
【问题讨论】:
-
您必须检查错误:
$dbh->do(..) or die $dbh->errstr并重试。 -
这表明我有语法错误,但这是我已经知道的。也就是说,我现在在其他地方使用
or die $dbh->errstr来更聪明地前进。谢谢。
标签: sql perl sqlite sql-update dbi