MySQLとPostgreSQLと・・・

投稿者:isc_blog

PHP+PostgreSQL(8.2.4)用に開発したアプリケーションをPHP+MySQL(5.1.22)に移植しようとした際に引っかかった点を書き残しておきます。

まず、はじめに私自身はどちらかというとOracleのSQLが最も得意で
あとは順に MySQL>SQLServer>PostgreSQL>Other という感じのスキルです。

で、今回、PHP+PostgreSQLでの開発だったのですが
PostgreSQLが大得意な方ならもっとこう違った書き方があるじゃん!という書き方をしていない前提です。

なので普段MySQL向けのSQLを書くことが多い方がPostgreSQLを使用する場合の注意点と言ってもいいかもしれません。

では、本題。

【日付の計算が違う】
例えば
データ投入日付が10日以内のデータを表示する・・・
みたいなSQL文です。

PostgreSQLの場合
[sql]
SELECT *
FROM user_tbl
WHERE CAST(insert_date AS DATE) + CAST(’10 days’ AS INTERVAL) >
current_timestamp
[/sql]
こんな感じ・・・

MySQLの場合だと
[sql]
SELECT *
FROM uset_tbl
WHERE DATE_ADD(insert_date, INTERVAL 10 DAY) > NOW()
[/sql]
こんな感じになります。

結構、こんな感じのSQLが多いと大変ですね。

【LIMIT OFFSETの使い方が違う】
PostgreSQLの場合は
[sql] 
offset 100 limit 10
[/sql]
と書いた場合
100件目から10件抽出 という意味なんですが

MySQLの場合は
[sql]
limit 100,10
[/sql]

100件目から10件抽出になります。
MySQL5以降の場合実はPostgreSQLから継承した書き方も出来ます。
[sql]
limit 10 offset 100
[/sql]
これも同じです。(10件中抽出、100件目から。)

で、問題なのが、PostgreSQLの場合は 「100件目から全部」みたいなSQL
[sql]
offset 100
[/sql]

が書けるのに対し、MySQLでは「limit」を書かずに「offset」を書くことが出来ないため
同じSQLは書けません。
※実際に試してNGだったのと、いろいろ調べましたがどの文献も「limit」の限界ありきのものしかなく「offset」の使用に関しても「limit」ありきな見解だったので「出来ない」と思っています。なにか手は無いものでしょうか。
※まぁ、Oracleならもっと複雑に書くべきところなので仕方ないですね。PostgreSQLのメリットということで・・・
※参考まで・・・Oracleでのlimit,offsetもどきを実践してくださっている文献

【MySQLのauto_incrementは・・・PostgreSQLで・・・】
MySQLのauto_increment はPostgreSQLで SERIAL になります。
具体的には

MySQL
[sql]
CREATE TABLE tablename (
colname MEDIUMINT NOT NULL AUTO_INCREMENT
);
[/sql]

PostgreSQLでは・・・・

[sql]
CREATE TABLE tablename (
colname SERIAL
);
[/sql]
すでに存在するテーブルに対して追加で行う場合は
[sql]
ALTER TABLE tablename ADD COLUMN 列名 SERIAL
[/sql]
となります。



今回あまり複雑なSQLを書いていないのでこのくらいです。

2011年8月3日