MySQLで使えてSQLiteで使えないSQL文
とあるWebアプリケーションを正月休みの間開発していたのですが、諸般の事情により最初に使っていたMySQLからSQLiteに切り替えることになりました。
その際に、いくつかSQLを変更する必要があったので、SQLiteとMySQLで使える文の違いをメモしておきます。
CREATE TABLE文
AUTO_INCREMENT
IDなどでよく使うAUTO_INCREMENTですが、SQLiteではこれを付けると構文エラーになります。
では、どのようにAUTO_INCREMENTを実現するかというと、
CREATE TABLE hoge( id integer PRIMARY KEY );
というinteger型でプライマリキーのカラムに、
INSERT INTO hoge(id) values(null);
と入れればオートインクリメントされます。
0を挿入するとMySQLだとインクリメントされますが、SQLiteではされません。
また、int(10)のような型でCREATEした場合はオートインクリメントになりません。
その他
- unsignedが使えない
- CREATE文の中で普通のINDEXは定義できない
- UNIQUE KEYではなくUNIQUE
INSERT文
- INSERT IGNORE INTO 〜が使えない
- 重複を許さないレコードを入れるときにチェックするのが面倒な場合に使っていたので残念。
- ON DUPLICATE KEY UPDATE 〜が使えない
- UNIQUE KEYの重複時に、INSERTからUPDATEに切り替えてくれるので、出現回数の計算とかに使っていました。
今回はSELECT関係では関数はほとんど使用していなかったので、特に問題はありませんでした。
CREATE関連の変更が多かったのですが、最初にテーブルを使うときにしか使わないので、全体的にあまり変更箇所はありませんでした。
SQLiteでINSERTを大量に実行すると非常に時間がかかりましたが、トランザクションを使えばこの問題は解決するらしいです。