Modül dersleri (3/4)
Tablolar ve kısıtlamalar oluşturma: DDL
Şu ana kadar zaten var olan tablolar üzerinde çalıştınız (customers,
orders…). DDL ("Veri Tanımlama Dili") aşağıdaki ifadeleri ifade eder:
şemanın kendisini oluşturun ve değiştirin: tablolar, sütunlar, kısıtlamalar,
indeksler.
CREATE TABLE: sözdizimi
CREATE TABLE nome_tabella (
colonna TIPO [vincoli_colonna],
…,
[vincoli_tabella]
);Örnek: müşterileri ve ürünleri birbirine bağlayan bir istek listesi:
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)
);Parça parça parçalayalım.
En yaygın türler
| Tür | Ne barındırıyor |
|---|---|
INTEGER / INT | Tam sayılar (-2,1B … +2,1B) |
BIGINT | Büyük tam sayılar |
NUMERIC(p, s) | Tam ondalıklar — para, yüzdeler |
TEXT | Değişken uzunluklu dizeler |
VARCHAR(n) | Maksimum uzunluğu n olan dizeler |
BOOLEAN | TRUE / FALSE / NULL |
DATE | Yalnızca tarih |
TIMESTAMP | Tarih + saat (saat dilimi yok) |
TIMESTAMPTZ | Tarih + saat dilimiyle birlikte saat |
SERIAL | INTEGER otomatik artan sıra ile |
Kısıtlamalar
Kısıtlama, PostgreSQL'in otomatik olarak uyguladığı bir kuraldır:
INSERT/UPDATE bunu ihlal ederse işlem başarısız olur.
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 fornitoKısıtlamalar bir sütunda satır içi veya tablo düzeyinde bildirilebilir
kısıtlamalar (alanların altında). Bileşik örneği UNIQUE:
UNIQUE (customer_id, product_id) -- niente coppia (cliente, prodotto) duplicataKONTROL kısıtlaması
CHECK özel bir kural uygular:
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 olmalıdır; birisi INSERT … threshold = -5 denerse, bu
kısıtlama hatasıyla başarısız olur.
Bırakma ve değiştirme
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;Sıra sende
Şu sütunlarla bir istek listesi tablosu oluşturun: id (SERİ BİRİNCİL ANAHTARI), customer_id (TAM SAYI BOŞ REFERANSLAR DEĞİL müşteriler (id)), ürün_id (TAM SAYI BOŞ REFERANSLAR DEĞİL ürünler (id)) add_on (DEFAULT CURRENT_DATE ile DATE NULL DEĞİL). Çifte bir UNIQUE kısıtlaması ekleyin (müşteri_id, ürün_id).
İpucu göster
BENZERSİZ (müşteri_kimliği, ürün_kimliği) altta tablo düzeyinde bir kısıtlama olarak.
3 denemeden sonra çözüm mevcut
Alıştırmayı gözden geçirin
Müşteriler tablosuna, DEFAULT false ile BOOLEAN, NOT NULL türünde bir haber bülteni sütunu ekleyin. Tek bir ALTER TABLE ifadesi kullanın.
İpucu göster
DEFAULT olmadan ALTER başarısız olur çünkü satırlar zaten mevcuttur ve yeni sütun NULL DEĞİLDİR.
3 denemeden sonra çözüm mevcut