PostgreSQL数値型完全ガイド:NUMERIC・INTEGER・BIGINT・DECIMAL・FLOAT型の使い分け

PostgreSQLでは、さまざまなデータ型を使用してデータを格納および操作します。データ型はデータの種類とその特徴を定義し、データの効率的な格納と処理を可能にします。データ型の中でも、数値型は日常のアプリケーション開発で最も頻繁に使用されます。

しかし、NUMERIC、INTEGER、BIGINT、DECIMAL、FLOAT、DOUBLE PRECISIONなど様々な種類があり、それぞれの特徴と使い方が異なります。この記事では、PostgreSQLの数値型の種類と特徴について、実践的なSQL例を交えながら分かりやすく解説します。

目次

PostgreSQL数値型の基本概念

PostgreSQLの数値型は、大きく分けて以下の3つのカテゴリに分類されます。

数値型の分類

分類型名用途
整数型SMALLINT、INTEGER、BIGINT整数値の格納
任意精度数NUMERIC、DECIMAL正確な小数計算(金額など)
浮動小数点数REAL、DOUBLE PRECISION、FLOAT科学計算・近似値

INTEGER型(整数型)完全ガイド

INTEGER型(INTとも表記)は、PostgreSQLで最も一般的に使用される整数型です。

INTEGER型の基本仕様

型名サイズ範囲用途例
SMALLINT2バイト-32,768 ~ 32,767年齢、小さいカウンター
INTEGER (INT)4バイト-2,147,483,648 ~ 2,147,483,647ID、一般的な数値
BIGINT8バイト-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807大きなID、累積値

PostgreSQL INTEGERの使用例

-- INTEGER型のテーブル作成
CREATE TABLE products (
    product_id INTEGER PRIMARY KEY,
    stock_quantity INTEGER NOT NULL,
    price INTEGER,
    created_year SMALLINT
);

-- データ挿入
INSERT INTO products VALUES (1, 100, 1500, 2026);

PostgreSQL INTとINTEGERの違い

INTとINTEGERは完全に同じです。INTはINTEGERの省略形として使用できます。

-- 以下は同じ意味
CREATE TABLE test1 (id INTEGER);
CREATE TABLE test2 (id INT);

BIGINT型の使い方と注意点

PostgreSQL BIGINTは、INTEGERの範囲を超える大きな整数値を扱う際に使用します。

BIGINTが必要なケース

  • 累積値やカウンターが21億を超える可能性がある
  • タイムスタンプ(ミリ秒単位)の格納
  • 大規模システムのユニークID
  • SNSのいいね数、フォロワー数

BIGINT PostgreSQL使用例

-- BIGINT型の実例
CREATE TABLE user_analytics (
    user_id BIGINT PRIMARY KEY,
    total_views BIGINT DEFAULT 0,
    timestamp_ms BIGINT NOT NULL
);

-- 大きな数値の挿入
INSERT INTO user_analytics VALUES 
(9223372036854775000, 5000000000, 1737331200000);

INTEGERとBIGINTのパフォーマンス比較

項目INTEGERBIGINT
ストレージ4バイト8バイト(2倍)
計算速度高速やや遅い
推奨用途一般的な整数大きな数値のみ

NUMERIC型(任意精度数)徹底解説

PostgreSQL NUMERIC型は、正確な小数計算が必要な場合に使用する最も重要な数値型です。

NUMERIC型の基本構文

-- NUMERIC(precision, scale)
-- precision: 全体の桁数
-- scale: 小数点以下の桁数

NUMERIC(10, 2)  -- 例:12345678.90(全10桁、小数2桁)
NUMERIC(5, 3)   -- 例:12.345(全5桁、小数3桁)
NUMERIC         -- 精度制限なし

PostgreSQL NUMERIC使用例

-- 金額計算でNUMERIC型を使用
CREATE TABLE invoices (
    invoice_id INTEGER PRIMARY KEY,
    subtotal NUMERIC(12, 2),      -- 例:9999999999.99
    tax_rate NUMERIC(5, 4),       -- 例:0.1000 (10%)
    total_amount NUMERIC(12, 2)
);

-- 正確な計算
INSERT INTO invoices VALUES (
    1,
    100000.00,
    0.1000,
    100000.00 * 1.1000
);

-- 小数点以下の桁数を指定
SELECT 
    subtotal,
    ROUND(subtotal * tax_rate, 2) AS tax_amount
FROM invoices;

PostgreSQL 小数点 桁数 指定の方法

-- NUMERIC型で小数点桁数を制御
CREATE TABLE measurements (
    measurement_id INT,
    value NUMERIC(8, 3)  -- 小数点3桁まで:12345.678
);

-- ROUND関数で動的に桁数指定
SELECT ROUND(123.456789::NUMERIC, 2);  -- 結果:123.46
SELECT ROUND(123.456789::NUMERIC, 4);  -- 結果:123.4568

NUMERIC型のパフォーマンス特性

  • メリット:精度が高く、丸め誤差なし
  • デメリット:計算速度が浮動小数点型より遅い
  • 推奨用途:金額、税率、精密測定値

DECIMAL型とNUMERIC型の違い

PostgreSQLでは、DECIMALとNUMERICは完全に同じです。

PostgreSQL DECIMALの実態

-- 以下は完全に同じ意味
CREATE TABLE prices1 (price NUMERIC(10, 2));
CREATE TABLE prices2 (price DECIMAL(10, 2));

-- 内部的にはどちらもNUMERICとして扱われる

DECIMALとNUMERICの使い分け

項目NUMERICDECIMAL
PostgreSQLでの実装ネイティブ型NUMERICのエイリアス
SQL標準
推奨PostgreSQL推奨他DBからの移行時

FLOAT・DOUBLE PRECISION型の特徴

浮動小数点数型は、近似値として数値を保存します。

PostgreSQL FLOATの種類

型名サイズ精度範囲
REAL (FLOAT4)4バイト約6桁1E-37 ~ 1E+37
DOUBLE PRECISION (FLOAT8)8バイト約15桁1E-307 ~ 1E+308
FLOAT(n)可変n≤24: REAL, n>24: DOUBLE精度指定

PostgreSQL DOUBLE PRECISION使用例

-- 科学計算でDOUBLE PRECISIONを使用
CREATE TABLE scientific_data (
    experiment_id INT,
    temperature DOUBLE PRECISION,
    pressure DOUBLE PRECISION,
    coefficient REAL
);

-- 大きな数値の計算
INSERT INTO scientific_data VALUES 
(1, 273.15, 101325.0, 1.4);

-- 浮動小数点演算
SELECT 
    temperature * 1.8 + 32 AS fahrenheit,
    pressure / 1000 AS kpa
FROM scientific_data;

FLOAT型の注意点:丸め誤差

-- 浮動小数点の丸め誤差の例
SELECT 0.1::FLOAT + 0.2::FLOAT;  -- 結果:0.30000000000000004

-- NUMERICなら正確
SELECT 0.1::NUMERIC + 0.2::NUMERIC;  -- 結果:0.3

重要:金額計算には絶対にFLOATを使わないでください!

数値型パフォーマンス比較

計算速度の比較

計算速度ストレージ効率精度
INTEGER最速優秀(4バイト)整数のみ
BIGINT高速普通(8バイト)整数のみ
NUMERIC遅い可変完全に正確
DOUBLE PRECISION高速優秀(8バイト)近似値

ストレージサイズの実例

-- 各型のストレージサイズ確認
SELECT 
    pg_column_size(123::SMALLINT) AS smallint_size,  -- 2バイト
    pg_column_size(123::INTEGER) AS integer_size,    -- 4バイト
    pg_column_size(123::BIGINT) AS bigint_size,      -- 8バイト
    pg_column_size(123.45::NUMERIC) AS numeric_size, -- 可変
    pg_column_size(123.45::REAL) AS real_size;       -- 4バイト

用途別おすすめ数値型

データ型選択フローチャート

データの性質推奨型理由
金額・通貨NUMERIC(12, 2)丸め誤差厳禁
ID、カウンター(小)INTEGER最も一般的
ID、カウンター(大)BIGINT21億超の可能性
パーセント・税率NUMERIC(5, 4)精密な計算
科学計算・座標DOUBLE PRECISION高速、広範囲
年齢・小さい値SMALLINTストレージ節約

実際のテーブル設計例

-- ECサイトのテーブル設計例
CREATE TABLE orders (
    order_id BIGINT PRIMARY KEY,           -- 大きなID
    user_id INTEGER NOT NULL,              -- 一般的なID
    subtotal NUMERIC(12, 2) NOT NULL,      -- 金額
    tax_rate NUMERIC(5, 4) NOT NULL,       -- 税率:0.1000
    shipping_fee NUMERIC(8, 2),            -- 送料
    discount_percent SMALLINT,             -- 割引率:0-100
    total_amount NUMERIC(12, 2) NOT NULL,  -- 合計金額
    created_at BIGINT NOT NULL             -- タイムスタンプ
);

実践SQL例

例1:金額計算(NUMERIC型)

-- 消費税計算
WITH sales AS (
    SELECT 
        10000.00::NUMERIC(10, 2) AS price,
        0.10::NUMERIC(5, 4) AS tax_rate
)
SELECT 
    price,
    ROUND(price * tax_rate, 0) AS tax,
    price + ROUND(price * tax_rate, 0) AS total
FROM sales;

-- 結果:
-- price: 10000.00
-- tax: 1000
-- total: 11000.00

例2:INTEGER型の範囲チェック

-- INTEGERの最大値・最小値
SELECT 
    2147483647::INTEGER AS max_int,      -- OK
    -2147483648::INTEGER AS min_int,     -- OK
    2147483648::INTEGER AS overflow;     -- エラー!

-- BIGINTなら問題なし
SELECT 2147483648::BIGINT;  -- OK

例3:型変換とキャスト

-- 数値型間の変換
SELECT 
    123.456::INTEGER AS to_int,              -- 123(切り捨て)
    123.456::NUMERIC(5, 1) AS to_numeric,    -- 123.5(丸め)
    123::DOUBLE PRECISION AS to_double,      -- 123.0
    '123.45'::NUMERIC(5, 2) AS str_to_num;   -- 123.45

よくある質問(FAQ)

PostgreSQL NUMERICとINTEGERの違いは何ですか?

INTEGERは整数専用で、NUMERICは小数を含む任意精度の数値を扱います。金額計算や正確な小数が必要な場合はNUMERICを使用してください。INTEGERは計算が高速ですが、小数を扱えません。

PostgreSQL BIGINTはいつ使うべきですか?

21億(2,147,483,647)を超える可能性がある整数にはBIGINTを使用します。例:大規模サイトのユーザーID、累積カウンター、ミリ秒タイムスタンプ、SNSのいいね数など。不要な場合はINTEGERの方がストレージ効率が良いです。

PostgreSQL NUMERICの精度はどう指定しますか?

NUMERIC(precision, scale)形式で指定します。precisionは全体の桁数、scaleは小数点以下の桁数です。例:NUMERIC(10, 2)は最大99,999,999.99を表現できます。金額にはNUMERIC(12, 2)が一般的です。

PostgreSQL DECIMALとNUMERICの違いは?

PostgreSQLでは完全に同じです。DECIMALはNUMERICの別名(エイリアス)として機能します。内部的には両方ともNUMERIC型として扱われます。PostgreSQLのドキュメントではNUMERICの使用が推奨されています。

PostgreSQL FLOATは金額計算に使えますか?

絶対に使わないでください。FLOATやDOUBLE PRECISIONは浮動小数点型で、丸め誤差が発生します(例:0.1 + 0.2 ≠ 0.3)。金額計算には必ずNUMERIC型を使用してください。

PostgreSQL INTとINTEGERの違いは?

完全に同じです。INTはINTEGERの省略形です。どちらを使っても同じ4バイト整数型として扱われます。可読性の観点からINTEGERの使用が推奨されますが、どちらでも問題ありません。

PostgreSQL 小数点の桁数を制限する方法は?

2つの方法があります:
1. NUMERIC型で定義時に指定NUMERIC(10, 2)(小数2桁まで)
2. ROUND関数で動的に制御ROUND(値, 桁数)

金額など固定桁数の場合は方法1、計算結果の表示調整は方法2が適しています。

PostgreSQL INTEGER型の最大値は?

2,147,483,647です。これを超える場合はBIGINT(最大値:9,223,372,036,854,775,807)を使用してください。SMALLINT型の最大値は32,767です。

PostgreSQL NUMERIC型のパフォーマンスは?

NUMERIC型は正確性優先で計算速度は遅いです。高速な計算が必要で精度が重要でない場合は、INTEGERやDOUBLE PRECISIONを検討してください。ただし金額計算では速度より正確性を優先すべきです。

PostgreSQL データ型 NUMERIC 型の使い分けは?

  • NUMERIC:金額、税率、正確な小数計算
  • INTEGER:ID、カウンター、整数値
  • BIGINT:大きな整数(21億超)
  • DOUBLE PRECISION:科学計算、座標、近似値

用途に応じて適切な型を選択することで、パフォーマンスとストレージ効率が向上します。

Anzai Hotaka

10 年の経験を持つコンピュータ エンジニア。Linux コンピュータ システム管理者、Web プログラマー、システム エンジニア。