dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

MySQL の insert ... select で未登録のレコードを登録

2023-10-26 00:24:11 | mysql
MySQL の insert ... select で、insert 先のテーブルに存在しないレコードを登録する方法のメモ。

■登録元テーブル(test_id_val1)
create table test_id_val1 (
  id         varchar(32) not null,
  val        varchar(32) not null,

  primary key (id)
);

insert into
  test_id_val1
  (id, val)
values
  ('id_01', 'val_01')
  , ('id_02', 'val_02')
  , ('id_03', 'val_03')
  , ('id_04', 'val_04')
  , ('id_05', 'val_05')
  , ('id_06', 'val_06')
;

実行後のテーブルの登録内容は以下の通り。
mysql> select * from test_id_val1;
+-------+--------+
| id    | val    |
+-------+--------+
| id_01 | val_01 |
| id_02 | val_02 |
| id_03 | val_03 |
| id_04 | val_04 |
| id_05 | val_05 |
| id_06 | val_06 |
+-------+--------+

■登録先テーブル(test_insert1)
create table test_insert1 (
  id         varchar(32) not null,
  id_rev     varchar(32) default null,

  primary key (id),
  index (id_rev)
);

insert into
  test_insert1
  (id)
values
  ('id_01'),
  ('id_02'),
  ('id_03')
;

update
  test_insert1
set
  id_rev = reverse(id)
where
  id_rev is null
;

実行後のテーブルの登録内容は以下の通り。
mysql> select * from test_insert1;
+-------+--------+
| id    | id_rev |
+-------+--------+
| id_01 | 10_di  |
| id_02 | 20_di  |
| id_03 | 30_di  |
+-------+--------+

■登録元テーブル(test_id_val1)の id を登録先テーブル(test_insert1)に登録
insert ignore into
  test_insert1
  (id, id_rev)
select
  t1.id
  , reverse(t1.id)
from
  test_id_val1 as t1
left join
  test_insert1 t2
on
  t2.id = t1.id
where
  t2.id is null
;

上記の insert ... select によって test_insert1 に登録されていなかった id_04 ~ id_06 が登録されまています。
mysql> select * from test_insert1;
+-------+--------+
| id    | id_rev |
+-------+--------+
| id_01 | 10_di  |
| id_02 | 20_di  |
| id_03 | 30_di  |
| id_04 | 40_di  |
| id_05 | 50_di  |
| id_06 | 60_di  |
+-------+--------+


SVG の要素にイベントを設定

2023-10-22 21:28:23 | SVG
SVG の要素にイベントを設定

SVG の要素にイベントを設定する方法のメモ。
<html>
<head>

<title></title>
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 200 200" style="background-color:#aaaaaa;"> <rect id="id-1" type="target" x="10" y="20" width="30" height="20" fill="#00ff00"/> <rect id="id-2" type="target" x="50" y="60" width="20" height="10" fill="#0000ff"/> </svg>
message area
<script language="javascript"> // クリックイベントハンドラ function click_event_handler(e) { const msg_area = document.getElementById('message_area'); msg_area.innerHTML += `clicked: id="${e.srcElement.id}"`; console.log(e); } // クリックイベントハンドラを設定 const tgts = document.querySelectorAll("[type='target']"); for (let tgt of tgts) { tgt.onclick = (e) => { click_event_handler(e); } } </script> </body> </html>

rect 要素をクリックすると、以下のように rect の id が表示されます。
clicked: id="id-1"
clicked: id="id-2"


MySQL で実行中のクエリを表示

2023-10-21 12:41:17 | mysql
MySQL で実行中のクエリを表示する方法のメモ。
以下のように show processlist で実行中のクエリを表示することができます。
show [full] processlist;


この他に、information_schema の PROCESSLIST テーブルで確認することもできます。
mysql> select * from information_schema.PROCESSLIST\G
*************************** 1. row ***************************
     ID: 9
   USER: root
   HOST: localhost
     DB: NULL
COMMAND: Query
   TIME: 176
  STATE: User sleep
   INFO: select sleep(10000)
*************************** 2. row ***************************
     ID: 8
   USER: root
   HOST: localhost
     DB: NULL
COMMAND: Sleep
   TIME: 173
  STATE:
   INFO: NULL

INFO が実行中のクエリです。
通常のテーブルと同様に各カラムに対して条件を指定して、実行中のクエリを絞り込むことができます。
mysql> select USER, COMMAND, INFO from information_schema.PROCESSLIST where COMMAND != 'Sleep'\G
*************************** 1. row ***************************
   USER: root
COMMAND: Query
   INFO: select sleep(100)

mysql コマンドに -c オプションを指定すると、クエリ内のコメントがそのまま INFO に表示されますので、コメントを使ったクエリ絞り込みを考えてみます。。
*************************** 1. row ***************************
     ID: 8
   USER: root
   HOST: localhost
     DB: NULL
COMMAND: Query
   TIME: 66
  STATE: User sleep
   INFO: select sleep(100) # QUERY: SLEEP_100
*************************** 2. row ***************************
     ID: 9
   USER: root
   HOST: localhost
     DB: NULL
COMMAND: Query
   TIME: 3
  STATE: User sleep
   INFO: select sleep(50) # QUERY: SLEEP_50

# QUERY_TYPE: {クエリ種別} の形式のコメントから {クエリ種別} を抽出します。
mysql> select TIME, regexp_substr(INFO, '# QUERY: ([^\r\n]+)') as QUERY_TYPE, INFO from information_schema.PROCESSLIST where COMMAND != 'Sleep'\G

*************************** 1. row ***************************
      TIME: 81
QUERY_TYPE: # QUERY: SLEEP_100
      INFO: select sleep(100) # QUERY: SLEEP_100
*************************** 2. row ***************************
      TIME: 6
QUERY_TYPE: # QUERY: SLEEP_50
      INFO: select sleep(50) # QUERY: SLEEP_50

上記の QUERY_TYPE で group by するとどんなクエリがどれだけ実行されているかを集計することもできます。
mysql> select regexp_substr(INFO, '# QUERY: ([^\r\n]+)') as QUERY_TYPE, count(1) as cnt from information_schema.PROCESSLIST where COMMAND != 'Sleep' group by QUERY_TYPE\G

*************************** 1. row ***************************
QUERY_TYPE: # QUERY: SLEEP_100
       cnt: 2
*************************** 2. row ***************************
QUERY_TYPE: # QUERY: SLEEP_50
       cnt: 1



MySQL のクエリの最大実行時間の指定

2023-10-19 23:40:46 | mysql
MySQL でクエリの最大実行時間を指定する方法のメモ。
クエリに /*+ max_execution_time(N) */ を指定すると、N msec で最大実行時間を指定することができます。

■最大実行時間を指定しない場合
mysql> select sleep(10);
+-----------+
| sleep(10) |
+-----------+
|         0 |
+-----------+
1 row in set (10.00 sec)


■最大実行時間を指定した場合
mysql> select /*+ max_execution_time(5000) */ sleep(10);
+-----------+
| sleep(10) |
+-----------+
|         1 |
+-----------+
1 row in set (5.00 sec)

最大実行時間で打ち切られています。

php7.4 のインストール

2023-10-09 00:12:24 | php
php7.4 のインストールメモ。

■remi
sudo yum install remi https://rpms.remirepo.net/enterprise/remi-release-8.rpm

■php74 のインストール
sudo yum install php74
sudo yum install php74-php-devel
sudo yum install php74-php-mysqlnd

■apacheの設定
/etc/httpd/conf.d/php.conf
LoadModule php7_module modules_php74.so

■php.ini の設定変更
以下で MySQL の接続先などを設定。
/etc/opt/remi/php74/php.ini