macOS を High Sierra にアップデートしたところ、トラブルぽつぽつ。
中でも困ったのが、MySQL Workbench が動作しなくなったこと。
で、検索したところ次のサイトを発見。
MySQL WorkbenchがmacOS High Sierraで使えなかったのでSQLPro for MySQLを購入したけど、実は過去バージョンで動作することが判明した件
http://tech-tokyobay.manju.tokyo/archives/668
ううむ、6.0.9 にダウングレードか、と思ったが、その前にアップグレードしてみたところ、うまく動作した。
6.3.9 => 6.3.10
自分が設定した客先運用中の MariaDB(MySQL) で binlog が吐かれていないことが判明!
って、いつも default の my.cnf で、binlog 取れていたのになぜ??
で、自社の各サーバで調べたところ、どうも
FreeBSD/MariaDB default my.cnf は binlog 設定済
CentOS7/MariaDB default my.cnf は binlog 未設定
らしい。
binlog 未設定な default あるとは知らなかった...
ちなみに、log-error は CentOS7 では default 設定
FreeBSD/MariaDB default my.cnf は log-error 未設定
CentOS7/MariaDB default my.cnf は log-error 設定済
なんだかなぁ。
MySQL って FULL OUTER JOIN 無いんだ(なぜだろう)。
その代用方法
RIGHT JOINとLEFT JOINをUNIONする
SELECT * FROM test1
LEFT JOIN test2 ON test1.id=test2.id
UNION
SELECT * FROM test1
RIGHT JOIN test2 ON test1.id=test2.id
ここから抜粋: https://mistymagich.wordpress.com/2011/01/06/mysql%E3%81%A7%E3%81%AE%E5%AE%8C%E5%85%A8%E5%A4%96%E9%83%A8%E7%B5%90%E5%90%88/
面倒くさい、FULL OUTER JOIN 欲しい!
あればこんな感じか。
SELECT * FROM test1
FULL OUTER JOIN test2 ON test1.id=test2.id
起動時のオプションに--log-updateを指定すると、差分(dump)ファイルができるよう。
http://www.atmarkit.co.jp/ait/articles/0107/24/news001_2.html
mysqldump ちょっと整理
- フツー(定義とデータのダンプ)
$ mysqldump -u root -p DB_NAME [TABLE_NAME] > file.sql
- テーブル定義のみ: -d オプション
$ mysqldump -u root -p -d DB_NAME [TABLE_NAME] > file.sql
で、「テーブル定義のみ」で、AUTO_INCREMENT=X がついちゃって困る時は、sed で対処するそうな。
- テーブル定義のみで、AUTO_INCREMENT=X 削除: -d オプション + sed
$ mysqldump -u root -p -d DB_NAME [TABLE_NAME] | sed -e 's/ AUTO_INCREMENT=[0-9]*//' > file.sql
- データのみ: -t オプション
$ mysqldump -u root -p -t DB_NAME [TABLE_NAME] > file.sql
- 条件付きダンプ(しらんかった) -w (where)オプション
$ mysqldump -u root -p -w="id >= 100 AND flag = 1" DB_NAME TABLE_NAME > file.sql
その他、 http://www.risewill.co.jp/blog/archives/1111 が詳しい。
何か統一した方が良いよなぁ...
曜日 | MySQL/DAYOFWEEK | MySQL/WEEKDAY | PHP/w | PHP/N |
オリジン | 日:1 | 月:0 | 日:0 | 月:1 |
月 | 2 | 0 | 1 | 1 |
火 | 3 | 1 | 2 | 2 |
水 | 4 | 2 | 3 | 3 |
木 | 5 | 3 | 4 | 4 |
金 | 6 | 4 | 5 | 5 |
土 | 7 | 5 | 6 | 6 |
日 | 1 | 6 | 0 | 7 |
mysql SQL で、CASE を使った UPDATE を実行。
UPDATE table1
SET
ccc =
CASE
WHEN aaa = '111'
THEN '888'
WHEN aaa = '222'
THEN '999'
END
;
と、ccc = 888/999 は、思った通りに設定されたが、それ以外のレコードの ccc には null が設定されてしまった!!
http://dev.mysql.com/doc/refman/5.1/ja/control-flow-functions.html によると
一致する結果値がない場合は、ELSE のあとの結果が戻され、ELSE パートがない場合は、NULL が戻されます。
だそうな...
なので、ELSE を追加した次が正しい記述。
UPDATE table1
SET
ccc =
CASE
WHEN aaa = '111'
THEN '888'
WHEN aaa = '222'
THEN '999'
ELSE ccc
END
;
ELSE は必須ですね。
テーブルにも別名をつけられるが、別名をつけるとオリジナルのテーブル名は使用できない様子。
これは OK
SELECT a_tbl.col1 FROM original_table_name AS a_tbl ;
これは NG
SELECT original_table_name.col1 FROM original_table_name AS a_tbl ;
別名なければ、もちろん OK
SELECT original_table_name.col1 FROM original_table_name;
ううむ、理屈は分かるが、ある部分だけちょこっと別名使用とはいかないんだなぁ...