Perl 插入或忽略后受影响的行数

Perl 插入或忽略后受影响的行数,perl,sqlite,dbi,Perl,Sqlite,Dbi,perl代码为我提供了受影响的行数为1,即使记录在使用DBI模块插入sqlite数据库时由于主键约束而被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

perl
代码为我提供了受影响的行数为1,即使记录在使用DBI模块插入sqlite数据库时由于
主键约束而被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
我在这里做错什么了吗。我需要根据$row的值0f执行另一段代码,如果忽略则为0,如果插入则为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。

相关:我支持@mob的建议。看起来很傻,但是您必须使用第二个(临时)表来存储
插入或忽略的结果。然后,您可以在第二个表上选择*
,然后您应该能够计算受
插入或忽略
影响的行数。显示表格定义。@CL您是对的。这与Perl和sql查询更好地与数据库配合使用有关。谢谢bohica。这个代码也适用于我。我不确定我是否在错误处理方面搞砸了。我想我需要再次检查我的代码。