Ana içeriğe geç
Modül 9 · Ders 2 ders 4Kurstaki 34/57~12 min
Modül dersleri (2/4)

Çoklu ve tablo düzeyinde kısıtlamalar

Veritabanındaki verilerin en temel katmanda ("veri bütünlüğü") doğru olmasını sağlamak esastır. Güvenliği yalnızca Node.js uygulamasına yazarsanız hatalar veritabanında tutarsız verilere neden olabilir. DDL seviyesindeki kısıtlamalar, aşılamaz son savunma hattıdır.

Ana kısıtlamalar

PRIMARY KEY (bir sütunu benzersiz kılar ve NULL DEĞİLDİR) ve klasik NOT NULL ve UNIQUE'ye ek olarak, verilerin mantıksal tutarlılığı için iki temel kategori vardır:

1. YABANCI ANAHTAR (Referans Bütünlüğü)

Bir REFERENCES kısıtlaması, işaret ettiği "ana" tabloda bir bağlantı kimliğinin gerçekten var olmasını sağlar. Örneğin, bir siparişin mevcut bir müşteriye bağlanması gerekir.

SQL
CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  customer_id INTEGER REFERENCES customers(id)
);

Yabancı Anahtar ne işe yarar?

  • customers içinde bulunmayan bir customer_id eklemenizi engeller.
  • Bir müşteriyi customers'den kendisine yönlendiren siparişler varsa DELETE (silmenizi) engeller ("yetim" kayıtlara karşı korur).

Ayrıca "ebeveyn" silindiğinde ne olacağına da karar verebiliriz:

SQL
customer_id INTEGER REFERENCES customers(id) ON DELETE CASCADE

ON DELETE CASCADE ile müşteriyi silersek, Postgres otomatik olarak tüm bağlantılı orders'ları kaldıracaktır! (Çok dikkatli kullanın; normalde işlemi engelleyen varsayılan ayar tercih edilir.)

2. Kısıtlamaları Kontrol Edin

Bir CHECK kısıtlaması, kaydetmeye devam etmeden önce bir boole ifadesini test ederek satırı doğrular.

SQL
CREATE TABLE contratti (
  id SERIAL PRIMARY KEY,
  stipendio NUMERIC(10,2) CHECK (stipendio > 0),
  data_inizio DATE,
  data_fine DATE,
  CHECK (data_fine > data_inizio)
);

İlk CHECK bir sütun kısıtlamasıdır (yalnızca stipendio anlamına gelir). Alttaki ikinci CHECK bir tablo kısıtlamasıdır (birden fazla sütundaki değerleri çaprazlayabilir ve altta bildirilmelidir).

Bir INSERT veya UPDATE başlangıçtan önce sonu kaydetmeye çalışırsa Postgres bunu bir hatayla reddedecektir!

Kısıtlamaları Adlandırma

Kısıtlamalara açık bir ad vermek (CONSTRAINT anahtar sözcüğünü kullanarak) genellikle iyi bir uygulamadır. Bu şekilde, Postgres bir kaydı engellediğinde, hata size örneğin "kısıtlama 'stipendio_positivo' ihlal edildi" bilgisini verecektir; bu, hata ayıklama için çok daha açıktır!

SQL
CREATE TABLE prodotti (
  id SERIAL PRIMARY KEY,
  nome VARCHAR(50),
  CONSTRAINT nome_univoco UNIQUE(nome)
);

Deneyin

Egzersiz#sql.m9.l2.e1
Denemeler: 0Yükleniyor…

Kimliği (SERIAL PRIMARY KEY) ve 'customer_id' (INTEGER) ile bir 'prenotazioni' tablosu oluşturun. Yabancı Anahtar kısıtlamasına açık bir ad vermek için CONSTRAINT fk_cliente FOREIGN KEY (customer_id) REFERENCES customer(id) öğesini kullanın. Bunu bir tablo kısıtlaması olarak altta yapın.

Düzenleyici yükleniyor…
İpucu göster

CONSTRAINT fk_cliente YABANCI ANAHTAR (local_column) REFERANSLAR external_table(external_colum) yazın

3 denemeden sonra çözüm mevcut

Özel mantıkla kısıtlamalar

Egzersiz#sql.m9.l2.e2
Denemeler: 0Yükleniyor…

Kimliği (SERIAL PRIMARY KEY), posti_totali (INTEGER) ve biglietti_venduti (INTEGER) ile bir 'eventi' tablosu oluşturun. 'check_capienza' adında bir tablo kısıtlaması ekleyin; burada biglietti_venduti asla posti_totali'den büyük olmamalıdır.

Düzenleyici yükleniyor…
İpucu göster

CONSTRAINT check_capienza CHECK (ifade) kullanarak kısıtlamayı aşağıya ekleyin

3 denemeden sonra çözüm mevcut