メインコンテンツにスキップ
モジュール 9 · レッスン 1 / 4コース内の 33/57~10 min
モジュールのレッスン (1/4)

高度なデータ型とENUM

前のレッスンでは、基本的な CREATE TABLE コマンドについて説明しました。次に、より正確かつ安全な方法でドメインをモデル化するために PostgreSQL が提供するいくつかの高度なデータ型を調べてみましょう。

数値型とテキスト型

PostgreSQL には数値とテキストのタイプがいくつかあります。適切なものを選択すると、検証と保管スペースの両方に役立ちます。

SQL
CREATE TABLE advanced_products (
  id           SERIAL PRIMARY KEY,
  name         VARCHAR(50) NOT NULL,
  description  TEXT,
  -- NUMERIC(p,s) dove p = cifre totali, s = cifre decimali
  price        NUMERIC(10, 2) NOT NULL,
  featured     BOOLEAN DEFAULT FALSE
);
  • TEXT 対 VARCHAR(n): Postgres ではパフォーマンスは同じです。 VARCHAR(n) は、データベース レベルで挿入長を明示的に制限する場合にのみ使用します。
  • NUMERIC(10, 2): 金銭や算術精度に最適です。ここでは、最大 8 桁の整数と 2 桁の小数点 (合計 10 桁) が許可されます。 10.555 を挿入すると、Postgres はそれを 10.56 に丸めます。

UUID タイプ

Web 上に公開される安全な識別子 (URL 内のパブリック ID など) の場合、多くの場合、従来の SERIAL 増分よりも UUID が優先されます。

SQL
CREATE TABLE public_orders (
  id          UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  customer    TEXT NOT NULL,
  total       NUMERIC(10, 2)
);

ENUM (列挙型)

多くの場合、列には事前に定義されたいくつかの値のうち 1 つだけを含める必要があります (注文ステータス: 「新規」、「支払い済み」、「発送済み」など)。 1 つのアプローチは CHECK キーワードを使用することですが、PostgreSQL はカスタム ENUM タイプを提供します。

SQL
-- Dobbiamo prima creare il tipo:
CREATE TYPE order_status AS ENUM ('nuovo', 'pagato', 'spedito', 'cancellato');

-- Ora possiamo usarlo in una tabella:
CREATE TABLE orders_demo (
  id SERIAL PRIMARY KEY,
  status order_status NOT NULL DEFAULT 'nuovo'
);

これにより、誰も無効なステータスを挿入できないことが保証され、データの一貫性が保護されます。

試してみてください

運動#sql.m9.l1.e1
試行回数: 0読み込み中…

id (SERIAL pk)、test_id (デフォルトの gen_random_uuid() を持つ UUID)、score (null 以外の整数)、および content (TEXT) を使用して「user_reviews」テーブルを作成します。他のフィールドでは、型を超えた明示的な制約は必要ありません。

エディターを読み込み中…
ヒントを表示

CREATE TABLE user_reviews (...) を記述してから、さまざまなフィールドを記述します。カンマを覚えておいてください。

3 回の試行後に解決策が利用可能になります

復習演習

運動#sql.m9.l1.e2
試行回数: 0読み込み中…

まず、値「admin」および「user」を持つ ENUM タイプ「user_role」を作成します。次に、ID (SERIAL pk) とロール (先ほど作成したタイプ、NOT NULL) を使用して「enum_users」テーブルを作成します。

エディターを読み込み中…
ヒントを表示

;を忘れないでください。 2 つのステートメント (CREATE TYPE と CREATE TABLE) を分離します。

3 回の試行後に解決策が利用可能になります