【MySQL】【Aurora】 仮想表 / ダミーテーブル ~ DUAL ~

■ はじめに

 * 以下の「問題の現象」の解決策として使用したダミーテーブル「DUAL」について、取り上げる

■ 問題の現象

 * MySQL で問題なかったSQL文「INSERT SELECT文」が、Amazon Aurola でSQL文法エラーになった

発生環境

問題があったAuroraのバージョン
 * Amazon Aurora : 5.6.10a
問題がなかったMySQLのバージョン
 * MySQL : 5.7.15

 # Amazon Aurora は、MySQL5.6互換らしいので、その差?

現象例

使用するテーブル
CREATE TABLE `person` (
	`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
	`first_name` VARCHAR(50) NULL DEFAULT NULL,
	`family_name` VARCHAR(50) NULL DEFAULT NULL,
	PRIMARY KEY (`id`)
)
COMMENT='人'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
現象が発生したSQL
INSERT INTO person(
            first_name, family_name)
SELECT 'Mike', 'Dean'
WHERE NOT EXISTS (SELECT * FROM person WHERE id=1);
https://dev.mysql.com/doc/refman/5.6/ja/insert-select.html
を確認したが問題なさそうだが...

原因

 * SELECTの後にFROM句がないため

解決案

* 今回のテーマ
 * DUAL(デュアル)を使用する
* 修正後のSQL文(MySQL/Auroraどっちも動く)
INSERT INTO person(
            first_name, family_name)
SELECT 'Mike', 'Dean' FROM DUAL -- ★「FROM DUAL」を追加★
WHERE NOT EXISTS (SELECT * FROM person WHERE id=1);

■ DUAL(デュアル)について

 * 仮想表 / ダミーテーブル
  => 詳細は、以下の参考文献を参照。


関連記事

SQL】レコードが存在していなかったら、INSERTするには

http://blogs.yahoo.co.jp/dk521123/34139759.html