MySQLでUPSERTとパーティショニングの両立方法が分からない

MySQLでUPSERTとパーティショニングを設定したいとします。運悪くパーティショニングをしたい列は一意にはなれないとします。

少し具体的にいうと、こんなテーブル。データが挿入された月毎でテーブルを分け、古いパーティションは後日捨てたい。timeがパーティショニングキーになります。一方システム要件として一意なデータを指定するにはidで十分なので、行の選択はidのみで指定されます。
create table test(id int, datetime time default current_timestamp);

MySQLでパーティショニングキーになる列には以下の要求事項があります。Partitioning Keys, Primary Keys, and Unique Keys (MySQL documentation)Link

  • そのテーブルに設定されている全てのUnique key/Primary keyに含まれていること
先にも言ったとおりtimeは一意性を保証できないので、idと組み合わせて一意性を確保することにします。
create table test(id int, datetime time, primary key(id, time)) 
partiotion by range columns(time)
 (partition p201612 values less than ('2016-12-01 00:00:00'),
  partition p201701 values less than ('2017-01-01 00:00:00'),
  partition p201702 values less than ('2017-02-01 00:00:00'),
  ...
 )

ここまでは問題なし。次にUPSERTとして有名なのは、INSERT ... ON DUPLICATE KEY UPDATE ...構文。が、Unique keyはidとtimeの二つで設定されているので、idだけ指定してtimeが適当ではINSERTしても重複と判定されずupdate文が実行されません。

重複判定させるためにid単独で別のUnique keyを作成しようとするとエラー。パーティションキーになる列は全てのUnique/primary keyに含まれるという制限に反するからです。

それならばとbefore updateのトリガーを指定して、更新しようとするidがテーブルになければidだけの行をinsertしておこうとする。

delimiter $$
create trigger test_updatetrigger
before update on test
for each row
begin
  if not exists (select 1 from test where id=new.id) then
    insert into test(id) values(new.id);
  end if;
end$$

これはトリガー発動時にエラー。トリガー関数内ではテーブルに対する操作は禁止されているLink とのこと。

というわけで現在ここで行き詰っており、王道であるアプリケーション側でのselect→insert/update対応になりそうです。こんな案件珍しくないと思うんだけど、なぜパーティションキーにUnique key設定が必要なんて使いにくい仕様があるんだろ。以前もちょっと複雑なSQL書こうとしたらハマった(で、MySQL捨てた)とか、どうも私はMySQLと馬が合わないようです。

— posted by mu at 07:03 pm   commentComment [0]  pingTrackBack [0]

こういう後悔はよくあること

ロードスターに乗るようになって時々声をかけられるようになりました。ある時はトラック運転手、ある時はバイクライダー。悪い気はしません。

今日は駐車場で年配の女性から。なんでも昔日産で自動車の搬送に関する仕事をしていたらしく、同社の色々な車を運転したとのこと。最近の車のデザインは「おでぶちゃん」で好きでないのだとか。

で、ロードスターを見てかつて運転した日産車の中で思い出したものがあったようですが名前が出てこない。私からスカイライン、シルビアの名前を出しましたがそんな名前じゃなかったとのこと。思い出せないままその方とは別れました。

「あ、(フェアレディ)Zかも…」と思ったのは帰りの運転中。思い出せなくてごめんなさいです。

— posted by mu at 07:25 pm   commentComment [0]  pingTrackBack [0]

またトラブった…

今週FreeNASLink のアップデートを適用したところ、今までJailからも見えていたdevfsがバッサリと見えなくなりました。FreeBSD関連の情報を見ると本来は/etc/devfs.rulesや/etc/rc.confを編集してJailにデバイスが見えるように設定するのが筋で、今まで見えていた方が何かおかしかったっぽいです。

とりあえず緊急回避的に、
/sbin/mount -t devfs devfs /your_jail_root/dev
をPostInitコマンドとして実行させることに。

以前も9.3→9.10にバージョンアップした時に、カーネルがFreeBSD 9から10に変わったことで別途入れていたカーネルモジュールがロードされなかったこともあったり。更新を無視したら毎日メール送ってくるし。FreeNAS、便利なんで使い続けたいのですが、ちょっと改造すると更新のたびにトラブルを警戒しないといけなくなるのが不満。FreeBSDに差し替えた方が良いのかなぁ…

[2016/10/3] タイトル変更

— posted by mu at 01:54 pm   commentComment [0]  pingTrackBack [0]

今頃Anniversary Updateが来た

Windows10のAnniversary Update、ネットで「すでに多くのマシンの配信されていることでしょう」と書かれても一向に配信されず、特に興味もなかったので放置していたのですが、昨日ついに一台に配信。

新しいマシンから順に配信されるという話を聞いたことがあるのですが、Haswell自作マシンでこの時期になるということは、IvyBridgeやBloomfieldはいつのことやら…

アップデート後感じた不具合はAs/RLink でファイルのドラッグ&ドロップがうまくいかない(ドラッグできない)くらいでしょうか(個人的には結構イラつくのですが)

[2016/9/30 追記] 一昨日、IvyBridgeノートPCに配信。あとは自作Bloomfield。As/RはWindowsを2回ほど再起動したら問題なくなりました。。やっぱり問題出る、再現条件不明。

[2016/10/6 追記] Bloomfieldアップデート完了。Haswellに来るのが遅かったので、もっと後になるかと思ってた。

— posted by mu at 11:12 am   commentComment [0]  pingTrackBack [0]

ぶる~いんぱるす~

blog20160716-BlueImpluse
左下はパシフィコ横浜

という、うる星やつらのネタを思い出す私は結構歳ですが、思えばそんな頃から存在しているブルーインパルス。

7/16にパシフィコ横浜に来るというのを当日聞きつけ、慌てて観に行った次第。心配したほど観客でごった返してもおらず、場所取りで苦労することはなかったです。

前日の関東地方は結構荒れ模様の天候だったため運営のホームページでは直前まで天候を気にしているような記述がありましたが、当日は雨風の心配はないものの曇りで上空はガスっており、司会者すら近くに来るまでどの方向からやってくるのか分からない始末。

せっかく横浜に来たんだから、横浜らしいものと一緒に写った写真を撮りたかったのですが、前述の通り来る方向が分かりにくかったのと、さすがに建造物の近くを飛んではくれなかったので、ここに貼った写真がせいぜい。これも海上を直進中に空域に別の航空機が侵入したということで、演目を中止して旋回中に偶然画画内に入ってくれただけ。演目も直進水平飛行のみで物足りないものでしたが、都市部ではこれでも頑張ったのでしょう。

さて今回のブルーインパルスは日本青年会議所が主催するサマーコンファレンスLink なるイベントのオープニングセレモニーとして呼ばれたもの。パシフィコ横浜を借りるだけでも金がある団体だと推測できるわけですが、その後の開会式も首相のビデオコメントがあったり、トークセッションに閣僚が出席してたりと。あぁそういう団体なのですね。でなきゃ横浜にブルーインパルス呼ぶ許可も取れないか。理事長の醸し出す雰囲気も含め、私の苦手とするパターンです…

— posted by mu at 12:22 am   commentComment [0]  pingTrackBack [0]

T: Y: ALL: Online:
ThemeSwitch
  • Basic
Created in 0.0240 sec.
prev
2017.11
next
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30