응용 프로그램을 개발할 때는 종종 데이터베이스에서 레코드를 삭제해야합니다. 삭제 작업이 완료된 후 삭제 된 레코드 수를 얻어야 할 수도 있습니다. PDO (PHP Data Objects)는 PHP에서 일반적으로 사용되는 데이터베이스 액세스 방법 중 하나입니다. 영향을받는 행의 수를 얻기 위해 pdostatement :: rowCount () 메소드를 제공합니다. 그러나 배치 삭제 작업의 경우 pdostatement :: rowCount ()를 사용하여 삭제 된 레코드 수를 얻을 때주의를 기울일 세부 정보가 있습니다.
pdostatement :: rowCount () 메소드는 가장 최근에 실행 된 SQL 문의 영향을받는 행의 수를 반환합니다. 일반적으로 쿼리 작업 후 (예 : 업데이트 또는 삭제 )에 영향을받는 행의 수를 얻는 데 사용됩니다.
<?php
// 우리에게 이미 하나가 있다고 가정합니다 PDO 예
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'root', '');
// 레코드를 삭제하십시오
$stmt = $pdo->prepare("DELETE FROM users WHERE id = :id");
$stmt->bindParam(':id', $id);
$stmt->execute();
// 삭제 된 레코드 수를 얻으십시오
$deletedRows = $stmt->rowCount();
echo "삭제 {$deletedRows} 기록";
?>
그러나 배치로 삭제할 때 RowCount () 메소드는 예상대로 삭제 된 레코드 수를 반환하지 않을 수 있습니다.
배치 삭제를 수행 할 때 pdostatement :: rowCount ()에 의해 반환 된 행의 수는 정확히 기대치와 일치하지 않을 수 있습니다. 이는 일부 데이터베이스 (예 : MySQL)가 쿼리를 최적화하고 배치 삭제를 수행 할 때 다른 수의 영향을 반환 할 수 있기 때문입니다.
예를 들어, MySQL에서 삭제 작업은 기준을 충족하는 레코드를 찾을 수 없기 때문에 삭제 작업이 0 행에 영향을 미칩니다. 배치 삭제 작업의 경우에도 실제 삭제 된 레코드 만 계산됩니다. 이 시점에서 RowCount ()는 특히 기준을 충족하는 레코드가없는 경우 0으로 돌아갈 수 있습니다.
배치 삭제의 경우 올바른 삭제 된 레코드 수를 보장하려면 다음 방법을 고려할 수 있습니다.
한 가지 방법은 먼저 삭제 작업을 수행 한 다음 삭제 된 레코드 수를 쿼리하는 것입니다. 삭제 명령문을 실행 한 후 SELECT COUNT () 쿼리를 실행하여 삭제 된 레코드 수를 얻습니다.
<?php
// 우리가 모든 연령보다 적은 연령을 삭제하고 싶다고 가정 해 봅시다18사용자
$stmt = $pdo->prepare("SELECT COUNT(*) FROM users WHERE age < 18");
$stmt->execute();
$deletedCount = $stmt->fetchColumn();
// 삭제를 수행하십시오
$stmt = $pdo->prepare("DELETE FROM users WHERE age < 18");
$stmt->execute();
// 삭제 된 레코드 수를 확인하십시오
echo "삭제 {$deletedCount} 기록";
?>
배치 삭제 작업에서 트랜잭션을 활성화하면 데이터를 삭제하기 전에 정확한 레코드 수를 얻을 수 있습니다. 트랜잭션에서 삭제 작업 및 COUNT () 쿼리를 선택 하면이 둘 사이의 데이터 일관성을 확인할 수 있습니다.
<?php
// 거래를 시작하십시오
$pdo->beginTransaction();
try {
// 삭제 기준을 충족하는 레코드 수를 얻으십시오.
$stmt = $pdo->prepare("SELECT COUNT(*) FROM users WHERE age < 18");
$stmt->execute();
$deletedCount = $stmt->fetchColumn();
// 삭제를 수행하십시오操作
$stmt = $pdo->prepare("DELETE FROM users WHERE age < 18");
$stmt->execute();
// 거래를 제출하십시오
$pdo->commit();
// 삭제 된 레코드의 출력 번호
echo "삭제 {$deletedCount} 기록";
} catch (Exception $e) {
// 예외가 발생하는 경우,거래를 롤백하십시오
$pdo->rollBack();
echo "삭제가 실패했습니다: " . $e->getMessage();
}
?>
트랜잭션을 사용하면 삭제 작업과 레코드 카운트 쿼리 간의 데이터 불일치를 피할 수 있습니다.
반환 행 카운트를 지원하는 데이터베이스를 사용하는 경우 RowCount ()는 삭제 된 레코드 수를 정확히 반환해야합니다. 데이터베이스 실행 계획이 행 카운트에 영향을 미치는 오류를 반환하는 경우 조건부 쿼리, 로그 등과 같은 다른 방식으로 데이터를 보충해야 할 수도 있습니다.
배치로 데이터를 삭제할 때 pdostatement :: rowCount ()를 사용할 때 다음 지점에주의를 기울여 삭제 된 레코드를 얻으십시오.
RowCount ()가 반환 한 행 수는 특히 일부 최적화 된 SQL 작업의 경우 반드시 완전히 정확하지는 않습니다.
삭제 레코드의 정확한 수를 얻으려면 삭제 작업을 수행하기 전에 쿼리 카운트를 통해 기준을 충족하는 레코드 수를 얻을 수 있습니다.
트랜잭션을 사용하면 쿼리 및 삭제 작업의 원자력을 보장하고 중간 데이터의 불일치를 피합니다.
이러한 방법을 결합하여 배치 삭제 작업에서 삭제 된 레코드 수를보다 정확하게 얻고 데이터 운영의 안정성과 일관성을 향상시킬 수 있습니다.