我确定我可以选择它来检查是否存在一行,但我想知道是否有一种我不知道的滑动方式 - 似乎是一个足够普通的任务.这个SQLite表看起来像这样:
rowID QID ANID value
------ ------ ----- ------
0 axo 1 45
1 axo 2 12
Run Code Online (Sandbox Code Playgroud)
如果QID和ANID的组合已经存在,则应更新该值,如果QID和ANID的组合尚不存在,则应插入该值.虽然它简单易写:
SELECT * where QID = 'axo' and ANID = 3;
Run Code Online (Sandbox Code Playgroud)
并检查行是否存在然后分支和插入/更新我不能不寻找更好的方法.提前致谢!
Dal*_*ale 14
注意:REPLACE并不等于'UPDATE OR INSERT'... REPLACE替换整行.因此,如果未指定EVERY列的值,则将使用NULL或默认值替换未指定的列.
在一个简单的例子中,如上所述,它可能很好,但是如果你养成了使用REPLACE作为'UPDATE OR INSERT'的习惯,当你忘记为每个字段指定一个值时,你就会核对数据...经验.
Mar*_*nor 10
该插入文档详细介绍了REPLACE选项
INSERT OR REPLACE INTO tabname (QID,ANID,value) VALUES ('axo',3,45)
Run Code Online (Sandbox Code Playgroud)
"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;
Run Code Online (Sandbox Code Playgroud)
生成以下输出,演示一行的更新和另一行的插入
Row: axo - 1 - 45
Row: axo - 2 - 500
Row: axo - 10 - 500
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13660 次 |
最近记录: |