モジュールのレッスン (3/4)
テーブルと制約の作成: DDL
これまでのところ、すでに存在する テーブル (customers,
orders…)。 DDL (「データ定義言語」) は、次のステートメントを指します。
スキーマ自体の作成と変更: テーブル、列、制約、
インデックス。
CREATE TABLE: 構文
CREATE TABLE nome_tabella (
colonna TIPO [vincoli_colonna],
…,
[vincoli_tabella]
);例: 顧客と製品をリンクするウィッシュリスト:
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 の文字列 |
BOOLEAN | TRUE / FALSE / NULL |
DATE | 日付のみ |
TIMESTAMP | 日付 + 時刻 (タイムゾーンなし) |
TIMESTAMPTZ | 日付 + タイムゾーン付き時刻 |
SERIAL | INTEGER 自動インクリメントシーケンス |
制約
制約は、PostgreSQL が自動的に適用するルールです。
INSERT/UPDATE がこれに違反しているため、操作は失敗します。
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 の例:
UNIQUE (customer_id, product_id) -- niente coppia (cliente, prodotto) duplicataCHECK制約
CHECK はカスタム ルールを適用します。
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 を試行すると、
制約エラーで失敗します。
ドロップと変更
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;あなたの番です
次の列を含むウィッシュリスト テーブルを作成します: 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 回の試行後に解決策が利用可能になります
復習演習
Customers テーブルに、タイプが BOOLEAN (NOT NULL)、DEFAULT false のニュースレター列を追加します。単一の ALTER TABLE ステートメントを使用します。
ヒントを表示
DEFAULT を指定しないと、行がすでに存在し、新しい列が NULL ではないため、ALTER は失敗します。
3 回の試行後に解決策が利用可能になります