Ana içeriğe geç
Modül 8 · Ders 3 ders 4Kurstaki 31/57~12 min
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

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

Örnek: müşterileri ve ürünleri birbirine bağlayan bir istek listesi:

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)
);

Parça parça parçalayalım.

En yaygın türler

TürNe barındırıyor
INTEGER / INTTam sayılar (-2,1B … +2,1B)
BIGINTBüyük tam sayılar
NUMERIC(p, s)Tam ondalıklar — para, yüzdeler
TEXTDeğişken uzunluklu dizeler
VARCHAR(n)Maksimum uzunluğu n olan dizeler
BOOLEANTRUE / FALSE / NULL
DATEYalnızca tarih
TIMESTAMPTarih + saat (saat dilimi yok)
TIMESTAMPTZTarih + saat dilimiyle birlikte saat
SERIALINTEGER 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.

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

Kı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:

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

KONTROL kısıtlaması

CHECK özel bir kural uygular:

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 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

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;

Sıra sende

Egzersiz#sql.m8.l3.e1
Denemeler: 0Yükleniyor…

Ş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).

Düzenleyici yükleniyor…
İ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

Egzersiz#sql.m8.l3.e2
Denemeler: 0Yükleniyor…

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.

Düzenleyici yükleniyor…
İ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