Я посредственный с 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');
Есть ли лучший способ сделать это?
Вы должны проверить ошибки: '$ dbh-> do (..) или die $ dbh-> errstr' и повторите попытку. –
Это показывает, что у меня была синтаксическая ошибка, но это то, что я уже знал. Тем не менее, я теперь использую 'или умираю $ dbh-> errstr' в другом месте, чтобы сделать умнее идти вперед. Благодарю. – r3v