2009-03-30 3 views
7

테이블을 업데이트하는 업데이트 문이 있습니다. 마지막으로 수정 한 시간을 기록하는 열이 있습니다. 특정 행의 데이터가 변경되지 않은 경우 마지막으로 수정 한 날짜 시간을 변경하고 싶지 않습니다.SQL에서 행이 업데이트되었는지 확인하는 가장 좋은 방법

업데이트 문이 데이터 행을 변경하는지 여부를 확인하는 가장 좋은 방법은 무엇입니까?

감사합니다, 코드에서 대 오래된 새로운 데이터 대신 쿼리에서 그 일의

+0

사용중인 언어/프레임 워크에 대한 세부 정보를 제공해주십시오. 예를 들어, PHP에서 mysql_query는 업데이트 문에서 업데이트 된 행 수를 반환한다고 생각합니다. – kyle

+0

이 경우 실제로 C#/T-sql /Asp.Net –

답변

9

확인합니다.

데이터가 전혀 변경되지 않으면 DB 레이어를 불필요하게 신경 쓸 필요가 없습니다.

요약하면 데이터가 변경되지 않은 경우 UPDATE 문을 보내지 마십시오.

+0

을 사용하고 있습니다. 데이터를 가져 오기 위해 이전 쿼리 (SELECT)를 수행해야하는 상황이 있고 실제 업데이트를 수행하기 위해 두 번째 쿼리를 수행해야하는 상황이 있습니다. 이 경우에는 변경 사항이 발생하지 않더라도 하나의 UPDATE 쿼리 만 수행합니다. –

+0

나는 @jcinacio에 동의하지만 OP 질문은 여전히 ​​우리가 @ jcinacio와 같이 간다면 계속 머물러있다. 따라서 OP가 2005/2008 SQL을 사용하는 경우 OUTPUT 절을 사용하여 새 값과 이전 값을 비교할 수 있습니다. 아래 내 대답을 참조하십시오. – IsmailS

1

이 작업을 선행 적으로 수행하려면이 작업을 수행 할 수있는 유일한 방법은 기존 값과 새 값 (모든 값)을 비교하기 위해 업데이트 문의 WHERE 절을 수정하는 것입니다. 의 ANY이 같지 않으면 업데이트가 수행되어야합니다.

2

한 가지 방법은 트랜잭션을 시작하고 행의 내용을 선택한 다음이를 업데이트 할 대상과 비교하는 것입니다. 일치하지 않으면 업데이트를 수행하고 트랜잭션을 종료합니다. 일치하는 경우 트랜잭션을 롤백하십시오.

1

DAL을 사용하면 편리합니다. 그것은 모든 열을 추적하므로 아무 것도 변경되지 않으면 데이터베이스에 UPDATE 문도 보내지 않습니다.

1

테이블을 거쳐 일부 행을 수정하는 것과 같은 소리가 난 다음 테이블을 두 번째 뒤로 돌아가서 방금 변경된 행의 타임 스탬프를 업데이트하려고합니다.

두 번에 걸쳐 실행하지 마십시오. 당신이 변화하고 다른 어떤 열을 업데이트 할 때 그냥 같은 시간에 날짜/시간을 업데이트 :

UPDATE myTable 
SET retailprice = wholesaleprice * 1.10, 
    lastmodified = GetDate() 
WHERE ... 

을하거나 모든 행에 UPDATE 문을 발행하고 있지만 대부분의 행에 대해, 단지 값으로 설정합니다 이미 가지고 있니? 그러지 마.

UPDATE myTable 
SET retailprice = wholesaleprice * 1.10, 
    lastmodified = GetDate() 
WHERE retailprice <> wholesaleprice * 1.10 
0

당신은 대신이 DAL 층에서 위의 제안 된 내용을 할 수있는 T-SQL에서 UPDATE 트리거 쓸 수 - 비교 : 당신의 WHERE 절에 수정할 수 없습니다 것이다 해당 행을 제외 기존 레코드의 값과 갱신 명령문의 값을 비교하여 갱신 사항을 적용할지 여부를 결정하십시오. 트리거에서 Columns_Updated() 함수를 사용하여 업데이트가 있는지 확인할 수 있습니다.

컴퓨터의 관점에서 볼 때 특별히 효율적은 아니지만 한 번 쓸 수 있으며 응용 프로그램, 저장 프로 시저 또는 다른 프로세스가 레코드를 업데이트하려고 할 때이 상황을 처리합니다.

+0

기록 또는 이전 질문으로 인해 이것이 SQL Server 구성임을 어떻게 알 수 있습니까? –

+0

당신 말이 맞아요. 나는 가정했다. 그러나 다른 SQL 데이터베이스 (예 : Oracle)도 유사한 기능을 구현합니다. mySQL, Postgres 등은 잘 모릅니다. –

1

데이터를 제어 할 수 있는지 여부에 달려 있습니다. 위의 Seb는 업데이트를 수행하기 전에 새 데이터와 비교하여 이전 데이터를 확인해야한다는 점에서 정확합니다. 그러나 데이터가 귀하의 통제하에 있지 않은 경우에는 어떻게해야합니까?

당신이 웹 서비스를 업데이트하라는 메시지가 있다고 가정 해보십시오. 그런 다음 기존 데이터를 쿼리하고이를 새 데이터와 비교하는 것이 유일한 방법입니다.

업데이트로 인해 실제로 데이터가 변경되었는지 여부를 감지하는 SQL 기능을 알 수 없습니다.

업데이트 문에 포함 된 행 수를 SQL에서 감지하는 방법이 있습니다. 업데이트 문이 실제로 어떤 데이터를 변경했는지 여부를 감지하는 방법을 알지 못합니다. 흥미로울 것입니다.

1

SQL 2005/2008을 사용하는 경우 저장 프로 시저에서 다음과 같이 할 수 있습니다.

update newTable 
set  readKey='1' 
output inserted.id, 
     inserted.readKey as readKey, 
     deleted.readKey as prevReadKey 
into @tempTable 
where id = '1111' 

그럼 당신은 prevReadKey 및 readKey 모두가 당신이 마지막으로 수정 된 날짜를 재설정 할 수 있습니다 유사한 값을 갖는 경우 유사한 값이 있는지 확인하기 위해 @tempTable에서 선택할 수 있습니다.

이렇게하면 값이 실제로 변경되는 경우 테이블에서 여러 쿼리를 실행할 필요가 없습니다. 그러나 값이 변경되지 않는 경우에는 필요하지 않은 경우 두 개의 업데이트 구문을 실행합니다. 이러한 경우가 드물다면 괜찮을 것입니다.

P. 참고 : - 주어진 쿼리는 테스트되지 않았으므로 구문 적으로 잘못되었을 수 있습니다. 하지만 이것이 문제를 해결할 수있는 방법입니다. 내 프로젝트 중 하나에서 병합 성명과 함께 OUTPUT 절을 사용하여 다음과 같은 방식으로 수행했으며 업데이트 명령문으로도 수행 할 수 있습니다. 여기에 있습니다. reference of OUTPUT Clause

관련 문제