データベース作成

CREATE DATABASE <database> DEFAULT CHARACTER SET utf8mb4;

テーブル作成

CREATE TABLE sample (
    id INT AUTO_INCREMENT NOT NULL,
    created_at DATE,
    category VARCHAR(255),
    name  VARCHAR(255),
    amount INT,
    PRIMARY KEY(id)
);

レコード挿入例。

INSERT INTO sample (created_at, category, name, amount) VALUES ('2018-10-01', '通信', '携帯', '7000');
INSERT INTO sample (created_at, category, name, amount) VALUES ('2018-10-01', '通信', 'インターネット', '2500');
INSERT INTO sample (created_at, category, name, amount) VALUES ('2018-11-01', '通信', '携帯', '6500');
INSERT INTO sample (created_at, category, name, amount) VALUES ('2018-11-01', '通信', 'インターネット', '4000');
INSERT INTO sample (created_at, category, name, amount) VALUES ('2018-12-01', '通信', '携帯', '8000');
INSERT INTO sample (created_at, category, name, amount) VALUES ('2018-12-01', '通信', 'インターネット', '3000');

INSERT INTO sample (created_at, category, name, amount) VALUES ('2018-10-01', '光熱', '水道', '3000');
INSERT INTO sample (created_at, category, name, amount) VALUES ('2018-10-01', '光熱', 'ガス', '3000');
INSERT INTO sample (created_at, category, name, amount) VALUES ('2018-11-01', '光熱', '水道', '1800');
INSERT INTO sample (created_at, category, name, amount) VALUES ('2018-11-01', '光熱', 'ガス', '2000');
INSERT INTO sample (created_at, category, name, amount) VALUES ('2018-12-01', '光熱', '水道', '1600');
INSERT INTO sample (created_at, category, name, amount) VALUES ('2018-12-01', '光熱', 'ガス', '2100');

INSERT INTO sample (created_at, category, name, amount) VALUES ('2018-10-01', '食費', '昼食', '10000');
INSERT INTO sample (created_at, category, name, amount) VALUES ('2018-11-01', '食費', '昼食', '20000');
INSERT INTO sample (created_at, category, name, amount) VALUES ('2018-12-01', '食費', '昼食', '30000');

UNITON ALLを使った総計。

SELECT
       DATE_FORMAT(us.created_at, '%Y-%m')  AS 年月,
       us.分類,
       us.金額
FROM
    (
     SELECT
            1 AS ソートキー,
            created_at,
            DATE_FORMAT(created_at, '%Y-%m') as 年月,
            category AS 分類,
            sum(amount) AS 金額
     FROM
          union_sample
     GROUP BY
              DATE_FORMAT(created_at, '%Y-%m'),
              category
     UNION ALL
     SELECT
            2 AS ソートキー,
            created_at,
            DATE_FORMAT(created_at, '%Y-%m') AS 年月,
            '総計' AS 分類,
            sum(amount) AS 金額
     FROM
          union_sample
     GROUP BY
              DATE_FORMAT(created_at, '%Y-%m')
     ) us
ORDER BY
    DATE_FORMAT(us.created_at, '%Y-%m'),
    ソートキー;

テーブル定義参照

SHOW CREATE TABLE example_database;
DESCRIBE example_database;

Bool/Boolean型

BOOL、BOOLEAN

これらの型は TINYINT(1) のシノニムです。ゼロの値は false と見なされます。ゼロ以外の値は true と見なされます。

https://dev.mysql.com/doc/refman/5.6/ja/numeric-type-overview.html

CREATE TABLE bool_test(id int, enabled bool);
INSERT INTO bool_test(id, enabled) VALUE(1, true);
id enabled
1 1
SHOW CREATE TABLE bool_test;
CREATE TABLE `bool_test` (
  `id` int(11) DEFAULT NULL,
  `enabled` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
-- enableが1のものを抽出
SELECT * FROM bool_test WHERE enabled = true;

日付操作

mysql.pid

本節は Mac の場合です。

MySQL サーバー( mysqld )起動時に /usr/local/var/mysql に XXXXX.local.pid が作成されます。

ERROR! MySQL server PID file could not be found!

mysq.server start/stopERROR! MySQL server PID file could not be found! が発生したときの対処法です。

$ ps aux | grep mysql

46498   0.0  0.1  3087484   4276   ??  S    10:24AM   0:05.56 /usr/local/Cellar/mysql/5.6.22/bin/mysqld --basedir=/usr/local/Cellar/mysql/5.6.22 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/Cellar/mysql/5.6.22/lib/plugin --log-error=/usr/local/var/mysql/sawaihiroshi-no-MacBook-Air.local.err --pid-file=/usr/local/var/mysql/sawaihiroshi-no-MacBook-Air.local.pid

$ kill 46498

トラブルシューティング

TimeMachineで移行したデータファイルが壊れる

MacのTimeMachineで移行したデータファイルが壊れるという問題が発生しました(複数回)。

発生した問題

  • データベースが壊れる
  • 一部のテーブルが壊れる
    テーブルは存在するがアクセスできず削除もできない。

問題の解決策

  1. mysqld停止
  2. 既存データファイル削除(拡張子frm, ibd)
  3. 新規データベースやテーブル作成

既存データファイルの場所は下記SQLで確認できます。

SHOW VARIABLES LIKE 'datadir';

Homebrewでインストールしたときのデータディレクトリの例

/usr/local/var/mysql/ 

commnad

mysql> set transaction isolation level repeatable read;