【问题标题】:Using DBI in Perl to update multiple fields in one line?在 Perl 中使用 DBI 在一行中更新多个字段?
【发布时间】: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-&gt;do(..) or die $dbh-&gt;errstr 并重试。
  • 这表明我有语法错误,但这是我已经知道的。也就是说,我现在在其他地方使用or die $dbh-&gt;errstr 来更聪明地前进。谢谢。

标签: sql perl sqlite sql-update dbi


【解决方案1】:

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

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

【讨论】:

  • 这就是我一直在寻找的语法!非常感谢。
猜你喜欢
  • 2012-09-05
  • 2012-10-01
  • 2014-01-28
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
相关资源
最近更新 更多