2014-04-17 1 views
0

두 개의 다른 행 (역할)에 두 개의 열을 교환하려고합니다. 가능하다면 사용자 변수를 설정하여이 작업을 수행 할 수 있지만 모든 작업을 하나의 쿼리로 수행하려고했습니다.기본 키 충돌로 MySQL의 두 개의 다른 행에있는 두 개의 열을 바꾼다

내 쿼리는 다음과 같습니다

UPDATE table AS t1, table AS t2 
SET t1.role = 'standby', t2.role = 'primary' 
WHERE t1.sysid = t2.sysid AND t1.role = 'primary' AND t2.role = 'standby'; 

테이블 구조가

sysid | role | devid 
1  | primary | dev1 
1  | standby | dev2 

기본 키가 sysid이다, 역할 문제는 시간에 기본 키 사이의 갈등 것 같다

오류 : Error Code: 1706. Primary key/partition key update is not allowed since the table is updated both as 't1' and 't2'.

MySQL 이후 프로세스는 왼쪽에서 오른쪽으로, 나는 충돌을 피하기 위해 첫번째 (T1)에 임시 값을 설정 시도,하지만 여전히 같은 오류로 인해 실패 :

SET t1.role = 'tmp', t2.role = 'primary', t1.role = 'standby' 

은 MySQL과이를 달성 할 수있는 방법이 있나요?

답변

2

임시 값을 사용하여 역할을 바꿀 수 있습니다. 키 위반이 발생하지 않도록 아직 존재하지 않는 값을 선택하십시오. 데이터 무결성을 위해 트랜잭션을 사용하십시오.

START TRANSACTION; 
UPDATE table SET role = 'temprole' WHERE sysid = 1 and role = 'primary'; 
UPDATE table SET role = 'primary' WHERE sysid = 1 and role = 'standby'; 
UPDATE table SET role = 'standby' WHERE sysid = 1 and role = 'temprole'; 
COMMIT; 
+0

그래, 나는 그것이 갈 길이라고 생각했다. 나는 하나의 쿼리에서이 모든 작업을 시도했지만 MySQL이 자체 조인에서 기본 키를 교환하는 것을 좋아하지 않는 것처럼 보입니다. – Devon

+0

질문은 ... 트랜잭션에 있어야합니까? 나는 생각하고있다. 하나가 실패하면, 그들은 모두 실패 할 것 같습니다. – Devon

+0

거래에 넣는 것이 더 낫다 – Szymon

0
UPDATE table AS t1 join table AS t2 on t1.sysid=t2.sysid 
SET t1.role = if(t1.role = 'primary' AND t2.role = 'standby', 
       'standby', 
       if (t2.role = 'primary' AND t1.role = 'standby','primary',t1.role)); 

내가 열을 교환 실제로 PK 업데이트를 실행하는 것을 허용하지 않습니다

조건

UPDATE에 따라 하나를 두 테이블을 가입하고 업데이트합니다. 호출 전에 제한 조건을 설정해야합니다.

+1

아무 것도 변경되지 않습니다. http://www.sqlfiddle.com/#!2/6aa33c/1을 참조하십시오. – Barmar

0

SQL 문을 수동으로 만들어야하기 때문에 몇 년이 지났지 만 플립 플롭이 가능합니까?

UPDATE table SET role=IF(role='primary', 'secondary', 'primary') 
WHERE sysid = 1 
ORDER BY role ASC; 
+1

sqlfiddle에서 첫 번째 행을 업데이트 할 때 중복 키 충돌이 있기 때문에 작동하지 않습니다. 모든 업데이트를 동시에 수행하지는 않습니다. http://www.sqlfiddle.com/#!2/94f54 – Barmar

+0

예, 방금 해 보았습니다. 키 입력이 중복되었습니다. 그것은 PK가 아닌 필드에 유용한 도구입니다. – Devon

+0

일시적으로 색인을 제거하고이 교환을 한 다음 색인을 다시 추가 할 수 있습니다. – Barmar