【问题标题】:Number of rows affected after insert or ignore into插入或忽略后受影响的行数
【发布时间】: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 查询与数据库很好地配合。

标签: perl sqlite dbi


【解决方案1】:
use strict;
use warnings;
use 5.016;
use DBI;

my $h = DBI->connect("dbi:SQLite:db=x.db");
eval {
    $h->do(q/drop table test/);
};

$h->do(q/create table test (id integer, name varchar(10), constraint xx unique(id,name))/);

my $s = $h->prepare(q/insert or ignore into test values(?,?)/);
my @values = ([1, 'AAA'], [1, 'BBB'], [1, 'AAA'], [2, 'BBB'], [2, 'BBB']);
foreach (@values) {
    my $affected = $s->execute(@{$_});
    say join(",", @{$_}) . " = $affected";
}
$h->disconnect;

输出

1,AAA = 1
1,BBB = 1
1,AAA = 0E0
2,BBB = 1
2,BBB = 0E0

对我来说这看起来是正确的。我正在使用 DBI 1.631 和 DBD::SQLite 1.42。

【讨论】:

  • 谢谢博西卡。这段代码也对我有用。我不确定我是否对错误处理做了任何处理。我想我需要再次检查我的代码。
猜你喜欢
  • 1970-01-01
  • 2013-06-26
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
相关资源
最近更新 更多