カテゴリー
SugiBlog Webデザイナー・プログラマーのためのお役立ちTips

MySQL Safe Updatesモード

MySQLのSafe UpdatesモードがONのとき、UPDATEやDELETEを実行しようとすると以下のような警告が出てエラーになることがあります。

Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.

これはUPDATEやDELETEでWHERE句を付けなかったり、WHERE句でキーとなるカラムに条件指定をしなかったときに、間違って大量のデータを更新・削除してしまうことを防ぐための機能が働いているためです。

この機能は非常に有り難いものではあるんですが、開発をしているとどうしてもそういった処理をしたい場合があると思います。
そんなときは一時的にSafe UpdatesモードをOFFにして作業しましょう。

Safe UpdatesモードをOFFにするには以下のコードを実行します。

SET SQL_SAFE_UPDATES = 0;

処理が終わったら、必ず元に戻しましょう。

SET SQL_SAFE_UPDATES = 1;
915 views

MySQLのチューニング(クエリ実行速度の改善)

MySQLのクエリ実行速度が遅いので調査・改善する機会がありましたので、それについて書いておきたいと思います。

チェックポイントは以下の通りです。

  • 適切なインデックスが貼られているか確認
  • EXPLAINで実際に使用されたインデックスの確認

適切なインデックスが貼られているか確認

まずは適切なインデックスが貼られているかを確認します。
ここをチェックしないと始まらないのでしっかりと確認します。
適切なインデックスが貼られていない場合は追加します。

EXPLAINで実際に使用されたインデックスの確認

インデックスを追加して、それでも実行速度に改善が見られない場合は、そのインデックスが実際に使われているかを調べます。
SQL文の前にEXPLAINを付加して実行します。

EXPLAINは、クエリー実行計画(MySQLがクエリーをどのように実行するかの説明)を取得するために使用されます。

EXPLAIN SELECT ...

表示された結果の内容を抜粋してご説明します。

possible_keys

利用可能なインデックスの一覧(候補)
続きを読む…»

858 views

MySQLのNULL安全等価演算子(宇宙船演算子)

今回はMySQLでのNULL安全等価演算子についてご紹介します。
NULL安全等価演算子とは<=>のことで、見た目が宇宙船に似ていることからSpaceship Operator(宇宙船演算子)とも言われます。
※他言語でもあるんですが、返り値が違ったりするのでご注意ください。

まず、値の比較について見ていきます。

11を等価演算子で比較します。

MySQL> SELECT 1 = 1;
+-------+
| 1 = 1 |
+-------+
|     1 |
+-------+

結果は真の1となりました。

次は10を比較してみましょう。

MySQL> SELECT 1 = 0;
+-------+
| 1 = 0 |
+-------+
|     0 |
+-------+

結果は偽の0となりました。

今後は1NULLを比較してみます。

MySQL> SELECT 1 = NULL;
+----------+
| 1 = NULL |
+----------+
|     NULL |
+----------+

結果は偽の0となるかと思いきや、NULLとなりました。

NULL同士を比較するとどうでしょうか。

MySQL> SELECT NULL = NULL;
+-------------+
| NULL = NULL |
+-------------+
|        NULL |
+-------------+

結果はNULLとなりました。

1NULLの場合は0NULL同士の場合は1になって欲しいですよね。
そこで登場するのが、今回のNULL安全等価演算子(宇宙船演算子)です。
それを使うと次のようになります。

1NULLの場合

SELECT 1 <=> NULL;
+------------+
| 1 <=> NULL |
+------------+
|          0 |
+------------+

NULL同士の場合

SELECT NULL <=> NULL;
+---------------+
| NULL <=> NULL |
+---------------+
|             1 |
+---------------+

ということで、まさに欲しい結果が返ってきてくれます。

続いてサンプルデータを用いて、実際の事例をご紹介します。
続きを読む…»

1,561 views

MySQL TRUNCATE関数で小数点以下の値を切り捨てる

MySQLのTRUNCATE関数を使うと小数点以下を指定の桁数で切り捨てることができます。

  • 小数点以下をすべて切り捨て

    SELECT TRUNCATE(32.768, 0);
    

    出力結果は32となります。

  • 小数点以下を2位までとし、3位以下を切り捨て

    SELECT TRUNCATE(32.768, 2);
    

    出力結果は32.76となります。

  • 第2引数に負の値を渡すと、小数点左側を指定した桁数まで0にできます。

    SELECT TRUNCATE(32.768, -1);
    

    出力結果は30となります。

公式リファレンス:https://dev.mysql.com/doc/refman/5.6/ja/mathematical-functions.html#function_truncate

1,112 views

MySQLで10進数を2・8・16進数に変換

MySQLで基数変換を行う方法をご紹介します。

2進数に変換

SELECT BIN(500);

出力結果は111110100となります。

8進数に変換

SELECT OCT(500);

出力結果は764となります。

16進数に変換

SELECT HEX(500);

出力結果は1f4となります。

CONV関数

又、CONV関数を使っても変換することが可能です。
先ほどとは逆に2進数から10進数に変換する場合等もこちらを使用します。

書式:CONV(値, 変換元の基数, 変換先の基数)

例)500を10進数から2進数に変換

SELECT CONV(500, 10, 2);

公式リファレンス
BIN関数:https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_bin
OCT関数:https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_oct
HEX関数:https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_hex
CONV関数:https://dev.mysql.com/doc/refman/5.6/ja/mathematical-functions.html#function_conv

652 views