MySQL

【MySQL】テーブル名を変更する。

例)
postテーブルをcommentに名前を変える。

rename table post to comment;

羅列すると順番に処理される。

rename table
	one to two,
	three to four,
	five to six;

2つのデータベースが同じファイルシステム上にある場合に限りデータベース間のテーブル移動にも使用可。

rename table db1.table to db2.table;

 

【MySQL】テーブルの複製を作成する。

テーブルの構造を丸々コピーしたものを作成したい場合。

例)
postsテーブルと同一構造のposts2テーブルを作成したい場合。

create table posts2 like posts;

データまでコピーしたい場合。

insert into posts2 select * from posts;

テーブルごとバックアップを取っておく際などに便利。

 

【MySQL】N日後を取得する。

DATE_ADD関数を用いる。

下記例。

■投稿してから30日以上経過している投稿を取得する。(時刻まで厳密に判定する場合)

select * from posts where date_add(insert_date, INTERVAL 30 DAY) <= now()

■上記と同等で、時刻は見ず日付のみで判定する場合。

select * from posts where date_add(DATE(insert_date), INTERVAL 30 DAY) <= CURDATE();

ちなみにdate_add関数はマイナスの数値も指定可能。その場合日付を遡ってくれる。

 

【MySQL】二つの日付の差を算出する。

ためのめちゃくちゃ便利な関数を見つけたのでメモ。

■TIMESTAMPDIFF

フォーマット

 TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)

日付または日付時刻式 datetime_expr1 および datetime_expr2 間の整数の差を戻す。結果のユニットは、unit 引数によって提示される。
unit に指定出来る引数は下記の通り。

FRAC_SECOND 、SECOND 、MINUTE 、HOUR 、DAY 、WEEK 、MONTH 、QUARTER 、YEAR
※上記引数には「SQL_TSI_」のプレフィックスを付加することも可能。

例)SQL_TSI_SECOND(SECONDと同等)

下記SQLの例。この場合二つの日付の差が秒数で返却される。

select timestampdiff(SQL_TSI_SECOND, insert_date, update_date) from posts;

これめちゃくちゃ便利ですわ。

 

【Mysqldump】ロリポップサーバーでMysqldumpをしようとしてSyntaxErrorが出る場合。

これはMysqlのバージョンとMysqldumpのバージョンが合っていないと起こる場合がある模様。

Mysql5.6を用いている場合はMysqldumpも5.6を利用してやらなければならないので、下記のようにバージョン5.6のバイナリを指定してやらなければならない。

/usr/bin/mysqldump-5.6 [コマンド]

標準で最新バージョンのパス通しておいてくれよ…。

 

【MySQL】複数レコードを1行にまとめる。

GROUP_CONCAT()関数を用いると、すべての行を文字列連結させることが出来る。

下記例。

select group_concat(name SEPARATOR ',') from users where 1=1;

的な感じ。

SEPARATORキーワードの後に指定した文字列で全ての行を連結してくれる。

これはマジでクッソ便利。

 

【MySQL】コマンドラインでMySQL実行中にテキストファイルのSQLを実行する方法。

めも。

mysql> source file_name.txt

sourceコマンドの後にファイル名を指定すればOK。
もし文字化けしたら実行前に「set names utf8」などを実行してから再度読みこむと幸せになれる。

 

【MySQL】SQLの発行時に文字コードをセットする。

指定した文字コードでSQLを発行したい時とか。

SQL流す前に下記のSQLを流す。

set names utf8;

※utf8の部分は任意の文字コード。

これでOK。(なはず。)