SQLite: возможный обновить строку или вставить, если это не существует?

Я уверен, что могу проверить, существует ли строка путем выбора его, но я задаюсь вопросом, существует ли дождевик способ, которым я просто не знаю - походит на достаточно общую задачу, что могло бы быть. Эта таблица SQLite выглядит примерно так:

rowID  QID    ANID  value
------ ------ ----- ------
0      axo    1     45
1      axo    2     12

Если комбинация QID и ANID уже существует, то значение должно быть обновлено, если комбинация QID и ANID уже не существует затем, это должно быть вставлено. В то время как его достаточно простое для записи:

SELECT * where QID = 'axo' and ANID = 3;

И проверьте, существует ли строка затем ответвление, и любой вставляет/обновляет, я не могу не искать лучший путь.Заранее спасибо!

12
задан Will 16 August 2010 в 20:01
поделиться

3 ответа

В документации insert подробно описана опция REPLACE

INSERT OR REPLACE INTO tabname (QID,ANID,value) VALUES ('axo',3,45)

Опцию "INSERT OR REPLACE" можно сократить до REPLACE.

Пример на Perl

Пересмотрите следующий пример, чтобы использовать составной первичный ключ

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
10
ответ дан 2 December 2019 в 05:14
поделиться

вы можете использовать команду REPLACE. Документы

4
ответ дан 2 December 2019 в 05:14
поделиться

В этой конкретной ситуации оказывается, что нет простого решения - по крайней мере, то, что мне удалось найти, несмотря на усилия Марка предложить его.

Решение, которое я использовал, может оказаться полезным для кого-то еще, поэтому я публикую его здесь.

Я определил первичный ключ с несколькими столбцами как 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, и т. Д.

1
ответ дан 2 December 2019 в 05:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: