Я уверен, что могу проверить, существует ли строка путем выбора его, но я задаюсь вопросом, существует ли дождевик способ, которым я просто не знаю - походит на достаточно общую задачу, что могло бы быть. Эта таблица SQLite выглядит примерно так:
rowID QID ANID value
------ ------ ----- ------
0 axo 1 45
1 axo 2 12
Если комбинация QID и ANID уже существует, то значение должно быть обновлено, если комбинация QID и ANID уже не существует затем, это должно быть вставлено. В то время как его достаточно простое для записи:
SELECT * where QID = 'axo' and ANID = 3;
И проверьте, существует ли строка затем ответвление, и любой вставляет/обновляет, я не могу не искать лучший путь.Заранее спасибо!
В документации insert подробно описана опция REPLACE
INSERT OR REPLACE INTO tabname (QID,ANID,value) VALUES ('axo',3,45)
Опцию "INSERT OR REPLACE" можно сократить до REPLACE.
Пересмотрите следующий пример, чтобы использовать составной первичный ключ
use strict;
use DBI;
### Connect to the database via DBI
my $dbfile = "simple.db";
unlink $dbfile;
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile");
### Create a table
$dbh->do("CREATE TABLE tblData (qid TEXT, anid INTEGER, value INTEGER, PRIMARY KEY(qid, anid))");
### Add some data
my $insert = $dbh->prepare("INSERT INTO tblData (qid,anid,value) VALUES (?,?,?)");
$insert->execute('axo', 1, 45);
$insert->execute('axo', 2, 12);
$insert->finish;
### Update data
my $insert_update = $dbh->prepare("REPLACE INTO tblData (qid,anid,value) VALUES (?,?,?)");
$insert_update->execute('axo', 2, 500);
$insert_update->execute('axo', 10, 500);
$insert_update->finish;
### Print out the data
my $select = $dbh->prepare("SELECT * FROM tblData ORDER BY 1,2");
$select->execute;
while (my @row = $select->fetchrow_array()) {
printf "Row: %s\n", join(" - ", @row);
}
$select->finish;
$dbh->disconnect;
exit 0;
Получается следующий результат, демонстрирующий обновление одной строки и вставку другой
Row: axo - 1 - 45
Row: axo - 2 - 500
Row: axo - 10 - 500
В этой конкретной ситуации оказывается, что нет простого решения - по крайней мере, то, что мне удалось найти, несмотря на усилия Марка предложить его.
Решение, которое я использовал, может оказаться полезным для кого-то еще, поэтому я публикую его здесь.
Я определил первичный ключ с несколькими столбцами как QID + ANID и попытался вставить его в таблицу. Если эта конкретная комбинация существует, она выдаст код ошибки 23000, который я затем могу использовать индикатор, что вместо этого должно быть ОБНОВЛЕНИЕ. Вот основная суть (в PHP):
try {
$DB->exec("INSERT INTO tblData (QID,ANID,value) VALUES ('xxx','x',1)");
}
catch(PDOException $e) {
if($e->getCode() == 23000) {
$DB->exec("UPDATE tblData SET value=value+1 WHERE ANID='x' AND QID='xxx'");
}
}
Фактический код, который я использовал, немного сложнее с использованием подготовки / заполнителей и обработки ошибки, если код не 23000, и т. Д.