teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

調整

2019/02/18 10:05

投稿

yambejp
yambejp

スコア117892

answer CHANGED
@@ -20,4 +20,35 @@
20
20
  ```
21
21
  1-5のデータはtypeが1なので更新される、
22
22
  6のデータはtype=1だけどorderが1,2,3ではないので対象外
23
- 7,8のデータはtypeが1じゃないので対象外
23
+ 7,8のデータはtypeが1じゃないので対象外
24
+
25
+ # 追記
26
+
27
+ > SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1-3' for key ~~~~
28
+
29
+ おそらく`type`,`order`に復号ユニーク属性がついていますね。
30
+ そうであれば条件が競合するので無理です。
31
+ 無理を前提でやるなら、たとえばorderがつねにプラスだとすれば一度マイナスデータで
32
+ 登録してあとから絶対値で更新するとかや利用はあります。
33
+
34
+ しかし逆にこれはunique属性をわざわざつけて競合しないようにしている設定を
35
+ 無効にししてしまうので、運用上正しいかどうかはわかりません
36
+
37
+ - sample
38
+ ```SQL
39
+ create table tbl (id int primary key,`type` int,`order` int,unique key(`type`,`order`));
40
+ insert into tbl values(1,1,1),(2,1,2),(3,1,3)
41
+ ```
42
+ とりあえずupdate
43
+ ```SQL
44
+ update tbl set `order`=coalesce(elt(field(`order`,1,2,3),2,3,1),`order`)
45
+ WHERE type=1
46
+ ```
47
+ 当然エラー
48
+
49
+ 無理やりやる
50
+ ```SQL
51
+ update tbl set `order`=coalesce(elt(field(`order`,1,2,3),-2,-3,-1),`order`)
52
+ WHERE type=1;
53
+ update tbl set `order`=abs(`order`);
54
+ ```

2

一部腸壊死

2019/02/18 10:05

投稿

yambejp
yambejp

スコア117892

answer CHANGED
@@ -8,11 +8,16 @@
8
8
  ```
9
9
 
10
10
  - 更新処理
11
+ ※ごめんなさい、調整しました
11
12
  ```SQL
12
13
  update tbl set `order`=elt(field(`order`,1,2,3),2,3,1)
13
14
  WHERE `order` IN(1,2,3) and type=1
14
-
15
15
  ```
16
+ ↓↓↓
17
+ ```SQL
18
+ update tbl set `order`=coalesce(elt(field(`order`,1,2,3),2,3,1),`order`)
19
+ WHERE type=1
20
+ ```
16
21
  1-5のデータはtypeが1なので更新される、
17
22
  6のデータはtype=1だけどorderが1,2,3ではないので対象外
18
23
  7,8のデータはtypeが1じゃないので対象外

1

調整

2019/02/18 08:14

投稿

yambejp
yambejp

スコア117892

answer CHANGED
@@ -4,7 +4,7 @@
4
4
  - 元データ
5
5
  ```SQL
6
6
  create table tbl (id int primary key,`type` int,`order` int);
7
- insert into tbl values(1,1,1),(2,1,2),(3,1,3),(4,1,2),(5,1,2),(6,1,1),(7,2,1),(8,3,2);
7
+ insert into tbl values(1,1,1),(2,1,2),(3,1,3),(4,1,2),(5,1,2),(6,1,4),(7,2,1),(8,3,2);
8
8
  ```
9
9
 
10
10
  - 更新処理
@@ -13,4 +13,6 @@
13
13
  WHERE `order` IN(1,2,3) and type=1
14
14
 
15
15
  ```
16
- 1-6のデータはtypeが1なので更新される、7,8のデータは対象外
16
+ 1-5のデータはtypeが1なので更新される、
17
+ 6のデータはtype=1だけどorderが1,2,3ではないので対象外
18
+ 7,8のデータはtypeが1じゃないので対象外