Oracleの商魂たくましさは尊敬しますが、MySQLのライセンス料値上げから先行きがどうなるか不透明なためPostgresを調査しています。数値型についてドキュメントを確認したときのメモです。(バージョンは9.0.1でOSはWindowsを対象としています。)
- 金額計算など精度が重要な数値については任意の精度を持つNumeric型を使用する。
- Numeric型はDecimal型と同一。
- Numeric型の精度と位取りについてはOracleと同一で Numric(10,3) と設定した場合、全体の桁数が10桁で、小数点以下の桁数が3桁を表す。
例:Numeric(10,3) => 1234567.891
精度または位取りの指定がない場合、実装されている限界の精度まで設定できるようにデータが設定される。
- 整数データ型については、bigint型に比べてinteger型の方が速度が速いため基本的にinteger型を使用する。
- 連番を設定する場合、連番型(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などの使用を検討しないとですね。