メインコンテンツにスキップ
モジュール 8 · レッスン 3 / 4コース内の 31/57~12 min
モジュールのレッスン (3/4)

テーブルと制約の作成: DDL

これまでのところ、すでに存在する テーブル (customers, orders…)。 DDL (「データ定義言語」) は、次のステートメントを指します。 スキーマ自体の作成と変更: テーブル、列、制約、 インデックス。

CREATE TABLE: 構文

SQL
CREATE TABLE nome_tabella (
  colonna  TIPO  [vincoli_colonna],
  …,
  [vincoli_tabella]
);

例: 顧客と製品をリンクするウィッシュリスト:

SQL
CREATE TABLE wishlists (
  id           SERIAL PRIMARY KEY,
  customer_id  INTEGER NOT NULL REFERENCES customers(id),
  product_id   INTEGER NOT NULL REFERENCES products(id),
  added_on     DATE NOT NULL DEFAULT CURRENT_DATE,
  note         TEXT,
  UNIQUE (customer_id, product_id)
);

一つ一つ分解してみましょう。

最も一般的なタイプ

タイプ内容
INTEGER / INT整数 (-2.1B … +2.1B)
BIGINT大きい整数
NUMERIC(p, s)正確な小数 — 金額、パーセンテージ
TEXT可変長文字列
VARCHAR(n)最大長が n の文字列
BOOLEANTRUE / FALSE / NULL
DATE日付のみ
TIMESTAMP日付 + 時刻 (タイムゾーンなし)
TIMESTAMPTZ日付 + タイムゾーン付き時刻
SERIALINTEGER 自動インクリメントシーケンス

制約

制約は、PostgreSQL が自動的に適用するルールです。 INSERT/UPDATE がこれに違反しているため、操作は失敗します。

SQL
PRIMARY KEY                         -- identifica univocamente la riga, non NULL
NOT NULL                            -- vieta NULL
UNIQUE                              -- vieta duplicati su questa colonna
REFERENCES tabella(colonna)         -- foreign key
CHECK (espressione_booleana)        -- es. CHECK (price > 0)
DEFAULT espressione                 -- valore di default se non fornito

制約は列上でインライン、またはテーブルレベルとして宣言できます。 制約 (フィールドの下)。複合 UNIQUE の例:

SQL
UNIQUE (customer_id, product_id)   -- niente coppia (cliente, prodotto) duplicata

CHECK制約

CHECK はカスタム ルールを適用します。

SQL
CREATE TABLE stock_alerts (
  product_id   INTEGER PRIMARY KEY REFERENCES products(id),
  threshold    INTEGER NOT NULL CHECK (threshold >= 0),
  notify_email TEXT    NOT NULL,
  active       BOOLEAN NOT NULL DEFAULT true
);

threshold は ≥ 0 でなければなりません。誰かが INSERT … threshold = -5 を試行すると、 制約エラーで失敗します。

ドロップと変更

SQL
DROP TABLE wishlists;                                 -- elimina la tabella (e i dati!)
DROP TABLE IF EXISTS wishlists;                       -- senza errore se non esiste
ALTER TABLE customers ADD COLUMN newsletter BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE customers DROP COLUMN newsletter;

あなたの番です

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

次の列を含むウィッシュリスト テーブルを作成します: id (SERIAL PRIMARY KEY)、customer_id (INTEGER NOT NULL REFERENCES customer(id))、product_id (INTEGER NOT NULL REFERENCES products(id))、added_on (DATE NOT NULL、DEFAULT CURRENT_DATE)。ペア (customer_id、product_id) に UNIQUE 制約を追加します。

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

下部のテーブルレベルの制約として UNIQUE (customer_id, product_id)。

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

復習演習

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

Customers テーブルに、タイプが BOOLEAN (NOT NULL)、DEFAULT false のニュースレター列を追加します。単一の ALTER TABLE ステートメントを使用します。

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

DEFAULT を指定しないと、行がすでに存在し、新しい列が NULL ではないため、ALTER は失敗します。

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