> 데이터 베이스 > MySQL 튜토리얼 > SQL UPDATE 작업 중에 이전 열 값을 검색하려면 어떻게 해야 합니까?

SQL UPDATE 작업 중에 이전 열 값을 검색하려면 어떻게 해야 합니까?

Mary-Kate Olsen
풀어 주다: 2025-01-04 09:42:35
원래의
119명이 탐색했습니다.

How Can I Retrieve Old Column Values During an SQL UPDATE Operation?

순수 SQL을 사용하여 업데이트 중 이전 열 값 검색

소개

데이터베이스에서 행을 업데이트할 때 원본에 액세스하는 것이 유용할 수 있습니다. 업데이트된 열의 값입니다. SQL은 업데이트 후 값을 검색하기 위해 RETURNING 절을 제공하지만 이전 열 값을 직접 가져오는 것을 지원하지 않습니다. 이 문서에서는 UPDATE 작업 중에 새 열 값과 이전 열 값을 모두 검색하는 해결 방법을 살펴봅니다.

Self-Join을 사용한 솔루션

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;
로그인 후 복사

이 쿼리는 다음 단계를 수행합니다.

  1. 하위 쿼리를 사용하여 업데이트할 행을 필터링하고 식별합니다.
  2. 원본 열에 액세스하기 위해 별칭(old_my_table)을 사용하여 테이블 자체를 조인합니다. 값.
  3. processing_by를 our_id_info로 설정하고 일치하는 행 ID에서만 조인합니다.
  4. 행 ID, 새processing_by 값 및 이전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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿