我敢肯定,可以通过选择行来检查是否存在,但是我想知道是否有一种我不知道的斜线方式-似乎已经足够常见。此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。

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

关于SQLite:是否可以更新或插入行(如果不存在)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3496866/

10-11 22:38
查看更多