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

PostgreSQLでは、さまざまなデータ型を使用してデータを格納および操作します。データ型はデータの種類とその特徴を定義し、データの効率的な格納と処理を可能にします。データ型の中でも、数値型は日常のアプリケーション開発で最も頻繁に使用されます。
しかし、NUMERIC、INTEGER、BIGINT、DECIMAL、FLOAT、DOUBLE PRECISIONなど様々な種類があり、それぞれの特徴と使い方が異なります。この記事では、PostgreSQLの数値型の種類と特徴について、実践的なSQL例を交えながら分かりやすく解説します。
目次
- PostgreSQL数値型の基本概念
- INTEGER型(整数型)完全ガイド
- BIGINT型の使い方と注意点
- NUMERIC型(任意精度数)徹底解説
- DECIMAL型とNUMERIC型の違い
- FLOAT・DOUBLE PRECISION型の特徴
- 数値型パフォーマンス比較
- 用途別おすすめ数値型
- 実践SQL例
- よくある質問(FAQ)
PostgreSQL数値型の基本概念
PostgreSQLの数値型は、大きく分けて以下の3つのカテゴリに分類されます。
数値型の分類
| 分類 | 型名 | 用途 |
|---|---|---|
| 整数型 | SMALLINT、INTEGER、BIGINT | 整数値の格納 |
| 任意精度数 | NUMERIC、DECIMAL | 正確な小数計算(金額など) |
| 浮動小数点数 | REAL、DOUBLE PRECISION、FLOAT | 科学計算・近似値 |
INTEGER型(整数型)完全ガイド
INTEGER型(INTとも表記)は、PostgreSQLで最も一般的に使用される整数型です。
INTEGER型の基本仕様
| 型名 | サイズ | 範囲 | 用途例 |
|---|---|---|---|
| SMALLINT | 2バイト | -32,768 ~ 32,767 | 年齢、小さいカウンター |
| INTEGER (INT) | 4バイト | -2,147,483,648 ~ 2,147,483,647 | ID、一般的な数値 |
| BIGINT | 8バイト | -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のパフォーマンス比較
| 項目 | INTEGER | BIGINT |
|---|---|---|
| ストレージ | 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の使い分け
| 項目 | NUMERIC | DECIMAL |
|---|---|---|
| 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、カウンター(大) | BIGINT | 21億超の可能性 |
| パーセント・税率 | 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:科学計算、座標、近似値
用途に応じて適切な型を選択することで、パフォーマンスとストレージ効率が向上します。





