2014-06-24 8 views
1

perl 코드는 DBI 모듈을 사용하여 sqlite 데이터베이스에 삽입하는 동안 PRIMARY KEY CONSTRAINT 때문에 레코드가 SQL 문에 의해 무시되는 경우에도 영향을받는 행 수는 1입니다. ID & NAME 복합 차에게 내가 여기서 뭐하는 거지 잘못된 키 -삽입 또는 무시한 후 영향을받는 행 수

ID NAME 
1 AAA 
1 BBB 
1 AAA 
2 BBB 
2 BBB 

아무것도있는 곳은 항상 데이터 세트 아래에 나에게 1과 $ 행을 제공

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"; 

. IGNORE의 경우 0이고 INSERTION의 경우 1 인 값 0f $ row를 기반으로 다른 코드 섹션을 실행해야합니다.

다른 방법으로 처리 할 수 ​​있습니까?

+0

관련 항목 : http://stackoverflow.com/questions/12105198/sqlite-how-to-get-insert-or-ignore-to-work – mob

+0

두 번째 @ mob의 추천입니다. 어리석은 것 같지만, INSERT OR IGNORE 결과를 저장하기 위해서는 2 번째 테이블을 사용해야합니다. 그런 다음 두 번째 테이블에서'*'를 선택하면 INSERT OR IGNORE의 영향을받는 행을 계산할 수 있습니다. – jimtut

+0

Perl에 대해서는 잘 모르겠지만 다른 곳에서는 시도해 보았습니다. SQLite는 변경 사항을 올바르게 계산합니다. 테이블 정의를 표시하십시오. –

답변

0
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를 사용하고있다.

+0

감사합니다. bohica. 이 코드는 나를 위해 일했습니다. 오류 처리 기능이 엉망인 지 잘 모르겠습니다. 내 코드를 다시 확인해야한다고 생각합니다. –