ray88’s diary

お仕事で困ったとき用の自分用の覚書

SQL指南書 条件を分岐させたUPDATE(CASE文応用)②

SQL 指南書集 目次 - ray88’s diary
【事例2】
主キーの入れ替え
a→b
b→a
【素人の作業例】

--STEP1: aを作業用の値「f」へ退避
UPDATE SomeTable
	SET p_key = 'f'
WHERE p_key = 'a';
--STEP2: b → a へ
UPDATE someTable
	SET p_key = 'a'
WHERE p_key = 'b';
--STEP3: f → b へ
UPDATE someTable
	SET p_key = 'b'
WHERE p_key = 'f';

【一括更新する方法・うまくいかなかった例】

※CASE式による分岐は一気に行われるため、通常重複エラーはおきないはずなんだけど、
 起きてしまいうまくできず。。。。検証中

→検証結果:一度に複数行の更新を行うが一時的な重複が発生することがあるらしい。

/* CASE 式で主キーを入れ替える(p.19) */
UPDATE SomeTable
   SET p_key = CASE WHEN p_key = 'a'
                    THEN 'b'
                    WHEN p_key = 'b'
                    THEN 'a'
                    ELSE p_key END
 WHERE p_key IN ('a', 'b');

【結局こちらの2ステップの方法でうまくいった】

--STEP1:変更対象のキーに _temp を追加
UPDATE SomeTable
   SET p_key = CASE WHEN p_key = 'a'
                    THEN 'b_temp'
                    WHEN p_key = 'b'
                    THEN 'a_temp'
                    ELSE p_key END;
					
--STEP2: a_temp → b ,  b_temp → a へ更新
UPDATE SomeTable
   SET p_key = REPLACE(p_key, '_temp', '')
 WHERE p_key IN ('a_temp', 'b_temp');

【参考】
テーブル
作成用SQL

/* 条件を分岐させたUPDATE */
CREATE TABLE SomeTable
(p_key CHAR(1) PRIMARY KEY,
 col_1 INTEGER NOT NULL, 
 col_2 CHAR(2) NOT NULL);

INSERT INTO SomeTable VALUES('a', 1, '');
INSERT INTO SomeTable VALUES('b', 2, '');
INSERT INTO SomeTable VALUES('c', 3, '');
INSERT INTO SomeTable VALUES('d', 4, '');