RDBMS 製品毎の違い

投稿者: | 2020年2月7日

2月に入ってから、書き始めた "相違点" シリーズが何気に楽しくて、続けています。

今日は、普段何気なく使っている RDBMS 機能の違いに触れたいと思います。
気づかないと思わぬ失敗を招くことがあるので、自分も日々精進です。

下記に列記したのは私が知っている相違点です(たぶん、他にもまだあります)。

ユニークキー制約

ユニークキー制約は(プライマリキーとは別に)ユニークキー制約を設けることのできる機能です。
※一意性制約とも呼ばれます。

ALTER TABLE {テーブル名} ADD UNIQUE {カラム名}
  • NULL 重複許可
    PostgreSQL
    MySQL
    Oracle
  • NULL 重複不可
    SQL Server

SQL Server のみ "NULL 重複不可" です。
他 DB が NULL であればスルーする(NULL を精査しない)のに対し、SQL Server は NULL もユニークキー制約の対象になります。

TRANSACTION

トランザクションは(各 DB で)DDL を対象とするか否かで対応が分かれています。

  • トランザクションに DDL を含める
    PostgreSQL
    SQL Server
  • トランザクションは DDL を含めない
    MySQL
    Oracle

PostgreSQL, SQL Server は TRUNCATE 文などの DDL をトランザクションに含めることが可能です。
MySQL, Oracle は(トランザクションに含められないため)DDL 直前で強制的にトランザクションが終了します。
そのため、ロールバックしても DDL 直後までしか復元できません。

TEXT 型

MySQL は TEXT 型の種類が豊富。
※ただ、PostgreSQL の TEXT 型の最大長が 1GB であるのに対し、MySQL は 64kB と違いを認識していないと思わぬトラブルに。

TEXT型 最大長 備考
TINYTEXT,TINYBLOB 255 Byte  
TEXT,BLOB 64 kB 他RDBMSにもあり
MEDIUMTEXT,MEDIUMBLOB 16 MB  
LONGTEXT,LONGBLOB 4 GB  

型の制限を超えた格納

  • MySQL は型の制限を超えた値の INSERT もよしなに処理してくれる
    ex. TINYINT 型に数値 200 を INSERT すると、127 が格納される。

  • ちなみに、PostgreSQL は当然エラーになる
    ex. TINYINT 型に数値 200 を INSERT すると、当該 SQL がエラーで失敗する。

  • ただし、PostgreSQL も(MySQL などと同様に)丸められるものの場合は、柔軟に対応してくれる
    ex. decimal(2,1) に数値 9.94 を INSERT すると 9.9 が INSERT される。
    ※数値 9.95 を INSERT すると(四捨五入で 10 になり桁あふれで)エラーになり失敗する。