복붙노트

[SQL] SQL 스왑 기본 키 값

SQL

SQL 스왑 기본 키 값

두 개의 데이터 세트 간 차 키 값을 교환 할 수있다? 그렇다면, 하나는 어떻게 할 것인가?

해결법

  1. ==============================

    1.단순화를 위해하자 당신이 두 개의 레코드가 있다고 가정

    단순화를 위해하자 당신이 두 개의 레코드가 있다고 가정

    id   name
    ---------
    1    john
    
    id   name
    ---------
    2    jim
    

    두 테이블 t에서 (그러나 그들은 다른 테이블에서 올 수)

    당신은 할 수

    UPDATE t, t as t2
    SET t.id = t2.id, t2.id = t.id
    WHERE t.id = 1 AND t2.id = 2
    

    노트 : 기본 키를 업데이트하면 다른 부작용이 어쩌면 선호하는 접근 방식은 그들이 다른 모든 컬럼의 값을 교환으로 기본 키를두고하는 것입니다.

    경고: 그 이유 왜 t.id = t2.id, t2.id = t.id SQL에 업데이트가 트랜잭션 수준에서 발생하기 때문이다 작동합니다. t.id 변수 아니며 = 할당하지 않습니다. 당신은로 해석 할 수 "값으로 설정 t.id 쿼리의 효과 전의 t2.id를, 값으로 설정 t2.id 쿼리의 효과 전의 t.id". 그러나 일부 데이터베이스, 적절한 차단을하지 않을 수 있습니다 예를 들어이 질문을 참조 (단, 아마 멀티 테이블 갱신 간주됩니다 쿼리, 위의 실행, MySQL의의 표준에 따라 행동).

  2. ==============================

    2.나는 (저스틴 동굴 비슷한 곳을 썼다) 다음과 같은 접근 방식을 선호한다 :

    나는 (저스틴 동굴 비슷한 곳을 썼다) 다음과 같은 접근 방식을 선호한다 :

    update MY_TABLE t1
    set t1.MY_KEY = (case when t1.MY_KEY = 100 then 101 else 100 end)
    where t1.MYKEY in (100, 101)
    
  3. ==============================

    3.바트의 솔루션 @ 유사하지만 약간 다른 방법을 사용 :

    바트의 솔루션 @ 유사하지만 약간 다른 방법을 사용 :

    update t
    set t.id=(select decode(t.id, 100, 101, 101, 100) from dual)
    where t.id in (100, 101);
    

    이것은 매우 동일하지만, 나는 디코드 더 나은 다음 경우를 알고있다.

    또한, 만들려면 @ 나는 경우를 추가했다 나를 위해 바트의 솔루션 작업 :

    update t
    set t.id = (case when t.id = 100 then 101 else 101 end)
    where t.id in (100, 101);
    
  4. from https://stackoverflow.com/questions/2810606/sql-swap-primary-key-values by cc-by-sa and MIT license