数値型のメモ

Oracleの商魂たくましさは尊敬しますが、MySQLのライセンス料値上げから先行きがどうなるか不透明なためPostgresを調査しています。数値型についてドキュメントを確認したときのメモです。(バージョンは9.0.1でOSはWindowsを対象としています。)

  1. 金額計算など精度が重要な数値については任意の精度を持つNumeric型を使用する。
  2. Numeric型はDecimal型と同一。
  3. Numeric型の精度と位取りについてはOracleと同一で Numric(10,3) と設定した場合、全体の桁数が10桁で、小数点以下の桁数が3桁を表す。

    例:Numeric(10,3) => 1234567.891

    精度または位取りの指定がない場合、実装されている限界の精度まで設定できるようにデータが設定される。

  4. 整数データ型については、bigint型に比べてinteger型の方が速度が速いため基本的にinteger型を使用する。
  5. 連番を設定する場合、連番型(SERIAL型)を使用する。

    CREATE TABLE tablename (

    colname SERIAL

    );

    これは、SEQUENCEを使用した以下の定義と同一の内容である。

    CREATE SEQUENCE tablename_colname_seq;

    CREATE TABLE tablename (

    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')

    );

    ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

    なお、連番を設定する場合以下の内容に注意すること。

    a.NOT NULL制約の設定

    b.UNIQUE制約の設定

    これは、SERIAL型を使用した場合でも上記aとbは自動的には設定されないため必要に応じて設定する必要がある。もちろん、PrimaryKey制約を設定すれば問題はない。

    (基本的には連番を設定する場合は主キーとなることが多いと思うSERIAL型を使用するよりもSEQUENCEを使用した方が利便性は高いか?)

    なお、SERIAL列にシーケンスの次の値を挿入するには、SERIAL列にデフォルト値を設定すればよい。

    (INSERT文の列リストからその列を除外する、または DEFAULT キーワードを使用することで行うことができる。)

 

こうして見てみるとOracleに似ていますね。C#から利用する場合には、接続方法を考えないといけないので躊躇していたのですが、DevartのADO.NET関連のプロバイダもしくはLinq To Postgresなどの使用を検討しないとですね。