SQL ServerからMySQLへする時にQueryではまったこと
2012年01月26日 16時53分
SQL Server用に作成したQueryをMySQLで動かしたら動かない動かない…
ということではまった点を記述。
1.SELECT INSERT 文
よく既にレコードが存在する場合はINSERTしないという場合に以下のように記述していた。
1 2 3 4 5 6 7 |
INSERT INTO table1(v1, v2) SELECT '値1', '値2' FROM table1 WHERE NOT EXISTS(SELECT * FROM table1 WHERE v1 = '値1' AND v2 = '値2') |
v1辺りが主キーと思ってみてほしい。
既にレコードが存在している場合はレコードを登録しないというQueryだ。
しかしMySQLだとこのQueryは動かない。
NOT EXISTSだろうがEXISTSだろうが行が取れないためにレコードが登録されなかった。
1 2 3 4 5 6 7 |
INSERT INTO table1(v1, v2) SELECT * FROM (SELECT '値1' AS c1, '値2' AS c2) tbl WHERE NOT EXISTS (SELECT 1 FROM table1 WHERE v1 = '値1' AND v2 = '値2') |
と一つサブクエリを挟むことで行が作成されレコードが登録されるようになる。
2.
DELETE文などで自分自身をサブクエリで参照することはできない
1 2 3 4 5 6 7 8 9 10 11 |
DELETE FROM tbl1 WHERE key IN ( SELECT key FROM tbl1 WHERE key2 = 'hoge' ) |
サブクエリ使わずにそのまま書ける文だがわかりやすくする為に完結なQueryにした。
key2の値がhogeのレコードのkeyの値を持つレコードを削除するという文だ。
これがMySQLではエラーになる。
※参考サイト
http://hamamuratakuo.blog61.fc2.com/blog-entry-427.html
上記の問題にあたったらSelect文とDELETE文を分けれる場合は分けた方が無難だろう。
3.
AUTO_INCREMENTは物理削除すると削除した番号を再利用する
SQL ServerのIDENTITYと同じ感覚で使用するとはまる。
主キーとして使用するには注意が必要。