데이터베이스에서 행을 업데이트할 때 원본에 액세스하는 것이 유용할 수 있습니다. 업데이트된 열의 값입니다. SQL은 업데이트 후 값을 검색하기 위해 RETURNING 절을 제공하지만 이전 열 값을 직접 가져오는 것을 지원하지 않습니다. 이 문서에서는 UPDATE 작업 중에 새 열 값과 이전 열 값을 모두 검색하는 해결 방법을 살펴봅니다.
RETURNING 절 제한에도 불구하고 원본 열에 액세스할 수 있습니다. 테이블 자체를 조인하여 값을 생성합니다. 이 기술을 사용하면 트리거나 저장 프로시저가 필요하지 않습니다.
UPDATE my_table SET processing_by = our_id_info -- unique to this worker FROM my_table AS old_my_table WHERE trans_nbr IN ( SELECT trans_nbr FROM my_table GROUP BY trans_nbr HAVING COUNT(*) > 1 LIMIT our_limit_to_have_single_process_grab ) AND my_table.row_id = old_my_table.row_id RETURNING my_table.row_id, my_table.processing_by, old_my_table.processing_by AS old_processing_by;
이 쿼리는 다음 단계를 수행합니다.
Self Join 솔루션은 동시 쓰기 없이도 잘 작동하지만 로드할 경우 여러 작업자가 동일한 행을 업데이트하려고 하면 동시성 문제가 발생합니다. 이 문제를 해결하려면:
SERIALIZABLE 격리 수준으로 트랜잭션을 직렬화하면 작업 중에 다른 트랜잭션이 데이터에 액세스할 수 없습니다. 그러나 이는 성능에 영향을 미칠 수 있습니다.
FOR UPDATE 절을 사용하여 업데이트할 특정 행을 잠그면 작업이 완료될 때까지 다른 트랜잭션이 해당 행을 수정하는 것을 방지할 수 있습니다. 이는 성능을 유지하면서 데이터 무결성을 보장합니다.
UPDATE tbl x SET tbl_id = 23 , name = 'New Guy' FROM (SELECT tbl_id, name FROM tbl WHERE tbl_id = 3 FOR UPDATE) y WHERE x.tbl_id = y.tbl_id RETURNING y.tbl_id AS old_id, y.name AS old_name , x.tbl_id, x.name;
셀프 조인을 사용하고 동시성 제어 메커니즘을 적용하면 UPDATE 중에 이전 열 값과 새 열 값을 모두 검색할 수 있습니다. 순수 SQL을 사용한 작업. 이 접근 방식은 데이터베이스 시스템에서 데이터 수정을 처리할 때 유연성과 제어 기능을 제공합니다.
위 내용은 SQL UPDATE 작업 중에 이전 열 값을 검색하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!