本エントリはFirebird Advent Calendar 2015の二日目です。
オープンソースRDBMS御三家(Firebird, MySQL, PostgreSQL)の中では、唯一FirebirdがSQL標準のMERGE文に対応していました。
MySQLではINSERT IGNOREにて、マッチしたときに、なにもしない(IGNORE = DO NOTHING)、
INSERT … ON DUPLICATE KEY UPDATEにて、マッチしたときに、更新(DO UPDATE)することにより、
MERGE文相当の処理ができていました。
PostgreSQLでは手軽に行えるUPSERTの機能はなかったのですが、今回MySQLのINSERT … ON DUPLICATE KEY UPDATEに
似た独自構文にて、9.5で対応することになりました。マッチしたときに差分表(m_shain)で更新するには、次のような例になります。
INSERT INTO shain(id, name) select id, name FROM m_shain ON CONFLICT ON CONSTRAINT 制約名 DO UPDATE set name = EXCLUDED.name;
MySQLと違う違うところは以下のとおり。
・ON DUPLICATE KEYではなく、ON CONFLICT ON CONSTRAINT
・MySQLと違って制約名が必要。
・表名(m_shain)修飾ではなく、EXCLUDEDというキーワードで修飾
まぁ詳しくはwikipediaのページにて。
んで、Firebird 2.xのMERGE文実装は、厳密にいうと上のページにもあるように複数のWHEN MATCHED | NOT MATCHED句に対応していなかったんですが、Firebird 3.0では、複数の記述にも対応し、さらにSQL:2008で拡張されたWHEN MATCHED THEN DELETEにも対応しました。パチパチ。
この部分では、一歩先ゆくFirebirdでした!
PlanetMySQL Voting: Vote UP / Vote DOWN
オープンソースRDBMS御三家(Firebird, MySQL, PostgreSQL)の中では、唯一FirebirdがSQL標準のMERGE文に対応していました。
MySQLではINSERT IGNOREにて、マッチしたときに、なにもしない(IGNORE = DO NOTHING)、
INSERT … ON DUPLICATE KEY UPDATEにて、マッチしたときに、更新(DO UPDATE)することにより、
MERGE文相当の処理ができていました。
PostgreSQLでは手軽に行えるUPSERTの機能はなかったのですが、今回MySQLのINSERT … ON DUPLICATE KEY UPDATEに
似た独自構文にて、9.5で対応することになりました。マッチしたときに差分表(m_shain)で更新するには、次のような例になります。
INSERT INTO shain(id, name) select id, name FROM m_shain ON CONFLICT ON CONSTRAINT 制約名 DO UPDATE set name = EXCLUDED.name;
MySQLと違う違うところは以下のとおり。
・ON DUPLICATE KEYではなく、ON CONFLICT ON CONSTRAINT
・MySQLと違って制約名が必要。
・表名(m_shain)修飾ではなく、EXCLUDEDというキーワードで修飾
まぁ詳しくはwikipediaのページにて。
んで、Firebird 2.xのMERGE文実装は、厳密にいうと上のページにもあるように複数のWHEN MATCHED | NOT MATCHED句に対応していなかったんですが、Firebird 3.0では、複数の記述にも対応し、さらにSQL:2008で拡張されたWHEN MATCHED THEN DELETEにも対応しました。パチパチ。
この部分では、一歩先ゆくFirebirdでした!
JUGEMテーマ:コンピュータ
PlanetMySQL Voting: Vote UP / Vote DOWN