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
ham
May 18, 2021
Technology
160
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
140
AI時代に「チーム開発」を見直す ~個人アサインへのシフトと、AI駆動開発の実践例~
ham0215
0
39
機能開発を止めないために!運用と開発のバランスを可視化するために使っている指標をご紹介
ham0215
0
55
未来のAI駆動開発をイメージしながらAI開発基盤を整備する
ham0215
1
61
AIと過ごす1日〜全業務フローにAIを組み込む実践ガイド〜
ham0215
0
140
生成AIによる生産性向上〜テック企業やファインディの活用事例〜
ham0215
1
130
生成AI導入の効果を最大化する データ活用戦略
ham0215
0
560
データ駆動経営の道しるべ:プロダクト開発指標の戦略的活用法
ham0215
2
520
開発組織における意思決定の実例〜開発優先度・組織構成・ツール導入〜
ham0215
0
120
Other Decks in Technology
See All in Technology
Microsoft のサポートとフィードバック総まとめ
murachiakira
PRO
0
110
元・セキュリティ学習経験0大学生による業務紹介 / An Introduction to the Job by a Former College Student with Zero Security Training Experience
nttcom
0
180
Lightning近況報告
kozy4324
0
220
10年間のブログ発信を振り返って見えたWebアプリケーションエンジニアとしての軌跡
stefafafan
0
190
入門!AWS Blocks
ysuzuki
1
190
AIチャット検索改善の3週間
kworkdev
PRO
2
180
GitHub Copilot app最速の発信の裏側
tomokusaba
1
260
Multi-Agent並列開発を 安全に回すための技術 / Technology for Safely Multi-Agent Parallel Development
tooppoo
0
180
Claude Codeをどのように キャッチアップしているか
oikon48
13
8.9k
フィジカル版Github Onshapeの紹介
shiba_8ro
0
320
「勝手に広まる」人気 AI エージェントを爆速で作ろう!(AWS Summit Japan 2026講演資料)
minorun365
PRO
10
2.5k
AWS Security Hub CSPMの成功・失敗体験
cmusudakeisuke
0
560
Featured
See All Featured
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Building Applications with DynamoDB
mza
96
7.1k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
150
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
200
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
170
Test your architecture with Archunit
thirion
1
2.3k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
610
Designing Experiences People Love
moore
143
24k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.4k
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