【发布时间】:2014-06-25 17:02:59
【问题描述】:
perl 代码为我提供了受影响的行数为 1,即使在使用 DBI 模块插入到 sqlite 数据库时,由于PRIMARY KEY CONSTRAINT 导致该记录被 sql 语句忽略。
my $stmt = 'INSERT OR IGNORE INTO table1 (ID, Name) VALUES (?,?)';
my $sth = $dbh->prepare($stmt);
$sth->bind_param( 1, $id, SQL_VARCHAR );
$sth->bind_param( 2, $name, SQL_VARCHAR );
my $row = $sth->execute() or die $DBI::errstr;
print "Row affected for id[$id]- $row\n";
对于ID & NAME 是复合主键的以下数据集,它总是给我 $row 作为 1-
ID NAME
1 AAA
1 BBB
1 AAA
2 BBB
2 BBB
我在这里做错了什么。我需要根据值 0f $row 执行另一段代码,在 IGNORE 的情况下为 0,在 INSERTION 的情况下为 1。
还有其他方法可以处理吗?
【问题讨论】:
-
我会支持@mob 的推荐。看起来很傻,但是您必须使用第二个(临时)表来存储来自
INSERT OR IGNORE的结果。然后您可以在第二张表上select *,然后您应该能够计算受INSERT OR IGNORE影响的行数。 -
我不了解 Perl,但在我尝试过的其他任何地方,SQLite 都能正确计算更改。显示表定义。
-
@CL 你是对的。这与 Perl 和 sql 查询与数据库很好地配合。