Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
MySQLのUPDATE文にORDERが指定できると知った件
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
ham
May 18, 2021
Technology
170
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
MySQLのUPDATE文にORDERが指定できると知った件
ham
May 18, 2021
More Decks by ham
See All by ham
プロダクト開発から業務改善コンサルまで。事業全体へ「染み出す」ことで広がるエンジニアの可能性
ham0215
0
160
AI時代に「チーム開発」を見直す ~個人アサインへのシフトと、AI駆動開発の実践例~
ham0215
0
51
機能開発を止めないために!運用と開発のバランスを可視化するために使っている指標をご紹介
ham0215
0
61
未来のAI駆動開発をイメージしながらAI開発基盤を整備する
ham0215
1
85
AIと過ごす1日〜全業務フローにAIを組み込む実践ガイド〜
ham0215
0
150
生成AIによる生産性向上〜テック企業やファインディの活用事例〜
ham0215
1
130
生成AI導入の効果を最大化する データ活用戦略
ham0215
0
590
データ駆動経営の道しるべ:プロダクト開発指標の戦略的活用法
ham0215
2
540
開発組織における意思決定の実例〜開発優先度・組織構成・ツール導入〜
ham0215
0
130
Other Decks in Technology
See All in Technology
Service Connect 上のサービスに ECS Service の外側から到達できなかった話
ota1022
1
130
モダンフロントエンド 開発研修
recruitengineers
PRO
3
470
QAエンジニア起点で進める、SmartHRにおける信頼性向上について
kaomi_wombat
1
120
20260801_スクフェス大阪
kgnkhkr
2
1.2k
Forza Horizon 6 のテレメトリ機能で 自動運転に使えそうな学習データを集める話
henjin0
0
140
Breaking the Seal: Static Deobfuscation of Compiled V8 JavaScript Bytecode Malware
hshrzd
0
580
老害フォレンジッカーはAI羊の夢を見るか?
tadmaddad
0
220
もう一度考える SRE チームの作り方・育て方 / Rethinking SRE #1: Building and Growing SRE Teams
rrreeeyyy
6
1k
Flutterをカメラで動かしたかった話
sony
1
120
クラウドセキュリティ入門 ~安全なクラウド利用のための基礎知識~
lhazy
10
7.9k
Master Dataグループ紹介資料
sansan33
PRO
1
4.8k
トヨタ⽣産⽅式(TPS)⼊⾨
recruitengineers
PRO
2
540
Featured
See All Featured
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
How GitHub (no longer) Works
holman
316
150k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
350
New Earth Scene 8
popppiees
3
2.5k
The Cult of Friendly URLs
andyhume
79
7k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
From π to Pie charts
rasagy
0
250
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
610
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.7k
Leo the Paperboy
mayatellez
8
2.1k
Transcript
MySQLのUPDATE文に ORDERが指定できると知った件 2021/5/18 Dev MTG ham
何をやろうとしていたのか
シーケンシャルなデータを更新しようとした 下記のテーブルのsequential_idを一括で更新しようとしていた。 ※同じparent_idで重複したsequential_idを持てないように、 [parent_id, sequential_id]でユニーク制約あり Field Type memo id bigint
PRIMARY KEY; auto_increment parent_id bigint sequential_id int unsigned parent_id内で連番
シーケンシャルなデータを更新しようとした 下記のデータがある場合、途中にレコードを追加したい。 id parent_id sequential_id 1 100 1 2 100
2 3 100 3 1と2の間に新しいレコードを入れたい
シーケンシャルなデータを更新しようとした 最終的にはこうなればOK id parent_id sequential_id 1 100 1 4 100
2 2 100 3 3 100 4 ・レコードが追加される ・id: 2, 3のsequential_idが1増える
シーケンシャルなデータを更新しようとした 下記のデータがある場合、途中にレコードを追加したい。 UPDATE文1発で実行したいので下記のクエリーで実行 UPDATE hoges SET sequential_id = sequential_id +
1 WHERE parent_id = 100 ABD sequential_id >= 2; id parent_id sequential_id 1 100 1 2 100 2 3 100 3 sequential_id=2はid: 2に使われている ので、先にid: 2, 3のsequential_idをず らす。
シーケンシャルなデータを更新しようとした 下記のデータがある場合、途中にレコードを追加したい。 UPDATE文1発で実行したいので下記のクエリーで実行 UPDATE hoges SET sequential_id = sequential_id +
1 WHERE parent_id = 100 ABD sequential_id >= 2; id parent_id sequential_id 1 100 1 2 100 2 3 100 3 sequential_id=2はid: 2に使われている ので、先にid: 2, 3のsequential_idをず らす。 ユニーク制約違反のエラーが発生・・・!!
シーケンシャルなデータを更新しようとした 下記のデータがある場合、途中にレコードを追加したい。 UPDATE文1発で実行したいので下記のクエリーで実行 UPDATE hoges SET sequential_id = sequential_id +
1 WHERE parent_id = 100 AND sequential_id >= 2; id parent_id sequential_id 1 100 1 2 100 2 3 100 3 Update文が1つでも内部的には1レコードずつ更 新される。 (✗全てのレコードが一発で同時更新されるわけ ではない) →MySQLでは順序が未指定の場合は大体Primary Key(今回はid)順に動く。 →今回もidの小さい2のレコードから更新しよう としてid:3のレコード(100-3のユニーク制約)と衝 突したと考えられる。
じゃあどうするか? 今回やりたいことはsequential_idのインクリメント。 ということはsequential_idの大きいものから順番に更新していけばユニーク 制約に引っかからないはず。 でもUpdateって内部の更新順制御できるの??? そこで公式ドキュメント https://dev.mysql.com/doc/refman/5.6/ja/update.html
じゃあどうするか? 今回やりたいことはsequential_idのインクリメント。 ということはsequential_idの大きいものから順番に更新していけばユニーク 制約に引っかからないはず。 でもUpdateって内部の更新順制御できるの??? そこで公式ドキュメント https://dev.mysql.com/doc/refman/5.6/ja/update.html ORDER BYあるやん!!!! UPDATE
[LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
シーケンシャルなデータを更新しようとした ORDER BY sequential_id DESCを付けることで無事Update成功 UPDATE hoges SET sequential_id =
sequential_id + 1 WHERE parent_id = 100 ABD sequential_id >= 2 ORDER BY sequential_id DESC; id parent_id sequential_id 1 100 1 2 100 3 3 100 4
シーケンシャルなデータを更新しようとした sequential_id: 2があいたのであとはINSERTすればOK INSERT INTO hoges (parent_id, sequential_id) VALUES (100,
2); 無事、id:4のレコードの追加完了!! id parent_id sequential_id 1 100 1 4 100 2 2 100 3 3 100 4