2016-06-12 6 views
1

나는 Perl DBI (execute_array)를 사용하고 있는데, 이것은 mysql 이상의 문제라고 생각한다.삭제 된 행이 없으면 mysql이 오류를 던진다. (존재하지 않는 행을 삭제하려고 시도한다.)

나는 몇 줄의 DELETE을 시도하고 있는데 명령이 오류없이 성공적으로 완료되지만 내 행이 삭제되지 않고있다 (수정 된 행은 0E0 즉 "0이 맞지만 사실" "0 rows deleted"). PHPMyAdmin을 통해 시도해도 문제가없는 행이 삭제되었습니다. 내 화면에서 일부 디버깅 및 긴 빈 쳐다 본 후 내 DELETE 문에서 사용하고 있던 열 중 하나가 추가되었을 때 잘린 것을 알았습니다. 그 이유는 내 스크립트에서 행을 찾을 수없는 이유를 설명했지만 PHPMyAdmin은 문제가 없었습니다. 그것. 그러나 이것은 왜 내가 어떤 오류도 얻지 못했음을 설명하지 못했습니다.

그래서 이것은 의도적으로 설계된 것입니다. 그러나 거기에없는 것을 삭제하려고 시도 할 때 mysql 오류를 발생시키는 방법이 있는지 궁금합니다. 내가 영향을받는 행의 수가 제공된 튜플 수와 같은지 확인할 수는 있지만, 어떤 행이 성공적으로 제거되었는지, 어떤 튜플이 존재하지 않는 행을 참조했는지 알 수는 없다. (이후 execute_array을 사용하고 있기 때문에) 이 아주 목적을 위해). 어떤 아이디어?

+1

아니요. 행을 찾지 못하는 'delete'는 오류가 아닙니다. 클라이언트 코드에서'modified rows = 0'을 확인할 수 있습니다. 데이터를 잘리는 것은 서버 설정에 따라 경고 또는 오류입니다. 그것은 시작하기에 더 좋은 장소 일 수 있습니다. 엄격 모드를 사용하도록 설정해야합니다. 그러면 오류가 발생합니다. – Solarflare

+0

예, 내가 말했듯이, 그것은 그것이 오류가 아니기 때문에 의도적으로 설계된 것 같아요. 그러나 저는'execute_array '를 사용하고 있기 때문에 DELETE를 실행할 때 찾을 수없는 튜플에 대한 에러를 던질 수 있기를 바랍니다. '그리고 튜플 중 어느 것이 (있다면) DELETE를 가져 오지 못했는지 확인하기 위해 체크한다. – insaner

답변

1

필자는 특정 유스 케이스에 대한 해결책을 찾았으며 다른 사람에게 유용 할 경우 게시하여 답변을드립니다. execute_array

$sth->execute_array({ ArrayTupleStatus => \@return_vector }) 

에 대한 대가로

실제로 행 당 "행 수정"값 을 반환 그것은 (성공, 실패하면 결과가 배열 심판이) 정말 아니지만, 그래서 오류, 난 그냥 주어진 된 튜플 실행이 0이 아닌 행을 수정했는지 여부를 확인할 수 있습니다. 반환 값은 '0E0'이므로 eq이 아닌 ==를 사용해야합니다.

if (ref $return_vector[$i]) 
    { print "DELETE failed, reason: $return_vector[$i][1]"; } 
elsif ($return_vector[$i] == 0) 
    { print "DELETE failed, no rows matched tuples"; } 
else 
    { print "DELETE successful"; }