2014-09-27 1 views
1

Я посредственный с perl и новичок в SQL, поэтому извините любую хромоту.Использование DBI в Perl для обновления нескольких полей в одной строке?

У меня есть скрипт perl, над которым я работаю, взаимодействует с базой данных, чтобы отслеживать пользователей в IRC. Из учебников, которые я нашел, я смог создать db, создать таблицу внутри, INSERT новую запись, ОБНОВИТЬ поле в этой записи и SELECT/find записи на основе поля.

Проблема в том, что я могу только выяснить, как ОБНОВИТЬ одно поле за раз, и это кажется неэффективным.

Код для создания таблицы:

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

Вы должны проверить ошибки: '$ dbh-> do (..) или die $ dbh-> errstr' и повторите попытку. –

+0

Это показывает, что у меня была синтаксическая ошибка, но это то, что я уже знал. Тем не менее, я теперь использую 'или умираю $ dbh-> errstr' в другом месте, чтобы сделать умнее идти вперед. Благодарю. – r3v

ответ

3

Вы можете обновить сразу несколько полей одновременно так же, как вы обновляете одно поле, просто перечислите их запятыми, разделенными в обновлении, что-то типа;

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

Это синтаксис, который я искал! Спасибо. – r3v

 Смежные вопросы

  • Нет связанных вопросов^_^