MySQLのこと。

MySQLのことについてまとめているブログ。他人に見せる用でもなく、自分の勉強備忘録。検索インデックスも外してるので、辿りついた方・・・ようこそ。そんな大した情報ないですよ?!たまにアルゴリズムの練習も

MySQLのイベントスケジューラーもどきをtask機能で作成する

Snowflakeとなにかをつないで、データ更新がうまく行くかどうか、検証環境を作りたい。"SNOWFLAKE_SAMPLE_DATA"."WEATHER"."HOURLY_16_TOTAL"というテーブルが自動更新されるようなので、これを使えば良いと思っていたけど、数年前からdeprecatedらしく、データが更新されていない。Snowflakeがまだよくわからないので、MySQLのイベントスケジューラーみたいな機能を使って、できないかと調べていたら、タスクという機能があるようで、それを使えば検証できそう。

下記、1分毎に1行インサートするタスクを作成し、起動するためのスクリプト。乱数系の関数とかをつかうと、サイレントエラー状態で、実行もうまく行かなかった。またドキュメントを時間あるときにでも読もう。

// タイムゾーン関連の設定
alter session set timestamp_type_mapping = 'TIMESTAMP_LTZ';
alter session set timezone = 'Asia/Tokyo';

// `task_demo.public.job_tracker`を作成
use role accountadmin;
create or replace database task_demo;
use schema public;
CREATE SEQUENCE "TASK_DEMO"."PUBLIC".id_seq START 1 INCREMENT 1;

//create or replace table job_tracker (
//  id integer,
//  created_at timestamp,
//  val1 integer,
//  val2 integer
//);

//create or replace table join_tbl (
//  id integer,
//  joined_val varchar(10)
//);

//insert into join_tbl(id, joined_val) values (1, 'tanaka'),(2, 'sato'),(3, 'suzuki'),(4, 'takahashi'),(5, 'Tom');
//insert into join_tbl(id, joined_val) values (47, 'cat'),(48, 'cat3'),(48, 'ca5t');
//select * from join_tbl;

// select current_timestamp()
// task1という名前のtaskを作成し、適当に値をインサートする
create or replace task task1
    warehouse = COMPUTE_WH
    schedule = '1 minute'
as
insert into job_tracker values (
  id_seq.nextval,
  current_timestamp(),
  second(current_timestamp()) * hour(current_timestamp())::integer,
  hour(current_timestamp())::integer
);

// task1を起動して確認
alter task task1 resume;
show tasks;

// 値がインサートされているかを確認
select * from job_tracker;

// 役目を終えたらtask1を削除
drop task task1;
drop table job_tracker;
drop table join_tbl;
drop database task_demo;

select * from job_tracker; 
// select * from job_tracker left join join_tbl on job_tracker.id = join_tbl.id;