RDBMS 製品毎の違い

目次

RDBMS 製品毎の相違点

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

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

RDBMS とは

RDBMS は、リレーショナル・データベース・マネジメント・システムの頭文字をとったものです。
※(R)リレーショナル(DB)データベース(M)マネジメント(S)システム。

それぞれの意味を簡単に列記します。

  • データベース
    データを蓄積する箱です。
    この箱に複数のテーブルを持ちます。
    そして、(データベース内に作成した)テーブルにデータを保管します。
  • リレーショナル
    上記のように、データベースにデータを記録する際はテーブルに保管します。
    このテーブル群に関係性を持たせて利用する(前提のデータベースが)リレーショナルデータベースです。
  • マネジメントシステム
    管理する仕組みのことです。
    大量のデータを蓄積しても、効率的に利用できるようにする仕組みが備わっていることを指します。

複数の製品

RDBMS には複数の製品があります。
有償で提供されているものから、OSS として無償で提供されているものまで様々です。

このページでは、主に下記 RDBMS について記載していきます。

  • OSS
    • MySQL(マイエスキューエル)
      インターネット黎明期を支えた OSS の RDBMS です。
      当時は、堅牢性よりも速度面を重視する姿勢が顕著に出ていましたが、最近は安定してきました。
    • MariaDB(マリアデービー)
      MySQL が Oracle 社の参加に入ったことで、MySQL から分離した派生パッケージです。
      MySQL と喧嘩をしているわけではなく、相互に情報提供をしながら開発が進められています。
    • PostgreSQL(ポストグレエスキューエル)
      PostgreSQL 開発者コミュニティ(PostgreSQL Global Development Group)にて開発・提供されている RDBMS です。
  • 有償
    • SQL サーバ(エスキューエル・サーバ)
      Microsoft 社が提供している RDBMS になります。
    • Oracle Database(オラクル・データベース)
      Oracle 社が提供している RDBMS です。

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

テーブルの複製

SQL では、SELECT 文の結果を元にテーブルを作成することが出来ます。
この(テーブル複製)機能を Web 開発当初は知らなかったので、知った時は衝撃でした。

※この方法は必ずしもキーが作成されないので注意が必要です。

命令文は、製品ごとに異なります。
※最後に記載した SQL Server の "INTO" には驚きましたが、慣れれば快適です。

  • MySQL
    CREATE TABLE {DEST_TABLE} ( SELECT * FROM {SRC_TABLE} );
  • PostgreSQL, Oracle
    CREATE TABLE {DEST_TABLE} AS SELECT * FROM {SRC_TABLE};
  • SQL Server
    SELECT * INTO {DEST_TABLE} FROM {SRC_TABLE};

ユニークキー制約

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

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

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

TRANSACTION

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

※DDL(Data Definition Language)は、データの定義に利用する SQL で CREATE, ALTER, DROP, TRUNCATE があります。

  • トランザクションに DDL を含まれる
    トランザクションに DDL が含まれるため、例えば TRUNCATE したデータが ROLLBACK されます。

    • PostgreSQL
    • SQL Server
  • トランザクションは DDL を含めない
    こちらは予想通り TRUNCATE したデータは ROLLBACK 不可です。

    • MySQL
    • Oracle

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

シーケンス

シーケンスは、俗に AUTO INCREMENT(オートインクリメント)と呼ばれ、データを INSERT するごとにカウントアップされていく機能です。
※製品ごとに呼び名が異なります。

なお、製品ごとの呼び名は以下の通り。

  • MySQL, MariaDB
    AUTO_INCREMENT(オートインクリメント)型。
  • SQL サーバ
    IDENTITY(アイデンティティ)型。
  • PostgreSQL
    SERIAL(シリアル)型。

このシーケンスが TRUNCATE で保護されるのかが気になって、確認してみました。
MySQL, PostgreSQL, SQL Server で確認したところ、結果は MySQL のみ戻りました。

詳細は、以下。

  • MySQL, MariaDB
    TRUNCATE した AUTO_INCREMENT 型は、ROLLBACK で戻る。
    ※ただし、DELETE 文は戻らないので注意。
  • SQL サーバ
    IDENTITY 型は ROLLBACK で戻らない。
  • PostgreSQL
    SERIAL 型は ROLLBACK で戻らない。

TEXT 型

MySQL は TEXT 型の種類が豊富です。最初驚きました。

TEXT型, BLOB型の種類 最大長 備考
TINYTEXT, TINYBLOB 255 Byte  
TEXT, BLOB 64 kB  
MEDIUMTEXT, MEDIUMBLOB 16 MB  
LONGTEXT, LONGBLOB 4 GB  

ノーマルの TEXT 型は他 RDBMS 製品にもありますが、製品ごとに仕様が異なります。
例えば、PostgreSQL の TEXT 型の最大長が 1GB です。
これに対して(上表の通り)MySQL は 64kB です。
この違いを認識していないと思わぬトラブルになるので、注意が必要です。

型の制限を超えた格納

  • 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 になり桁あふれで)エラーになり失敗する。