ماڈیول اسباق (2/4)
متعدد اور میز کی سطح کی پابندیاں
اس بات کو یقینی بنانا کہ ڈیٹا بیس میں ڈیٹا سب سے بنیادی پرت ("ڈیٹا انٹیگریٹی") پر درست ہے، بنیادی بات ہے۔ اگر آپ صرف Node.js ایپلی کیشن میں حفاظت لکھتے ہیں تو، کیڑے ڈی بی میں متضاد ڈیٹا کا سبب بن سکتے ہیں۔ ڈی ڈی ایل کی سطح پر رکاوٹیں دفاع کی آخری، ناقابل تسخیر لائن ہیں۔
اہم رکاوٹیں۔
PRIMARY KEY (جو ایک کالم کو منفرد اور NULL نہیں بناتا ہے) اور کلاسک NOT NULL اور UNIQUE کے علاوہ، ڈیٹا کی منطقی مستقل مزاجی کے لیے دو بنیادی زمرے ہیں:
1. غیر ملکی کلید (حوالہ جاتی سالمیت)
ایک REFERENCES رکاوٹ اس بات کو یقینی بناتی ہے کہ لنک کرنے والی ID واقعی "والدین" جدول میں موجود ہے جس کی طرف وہ اشارہ کرتا ہے۔
مثال کے طور پر، ایک آرڈر کو موجودہ کسٹمر سے منسلک ہونا چاہیے۔
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INTEGER REFERENCES customers(id)
);غیر ملکی کلید کیا کرتی ہے؟
- یہ آپ کو ایک
customer_idداخل کرنے سے روکتا ہے جوcustomersمیں موجود نہیں ہے۔ - یہ آپ کو کسی گاہک کو
customersسےDELETE(حذف کرنے) سے روکتا ہے اگر ان کی طرف اشارہ کرنے والے آرڈرز ہیں (یہ "یتیم" ریکارڈ سے حفاظت کرتا ہے)۔
ہم یہ بھی فیصلہ کر سکتے ہیں کہ جب "والدین" کو حذف کر دیا جائے تو کیا ہونا چاہیے:
customer_id INTEGER REFERENCES customers(id) ON DELETE CASCADEON DELETE CASCADE کے ساتھ، اگر ہم گاہک کو حذف کرتے ہیں، تو Postgres خودکار طور پر تمام لنک شدہ orders کو ہٹا دے گا! (بہت احتیاط کے ساتھ استعمال کریں؛ عام طور پر پہلے سے طے شدہ ترتیب جو آپریشن کو روکتی ہے بہتر ہے۔)
2. رکاوٹوں کو چیک کریں۔
ایک CHECK رکاوٹ محفوظ کرنے کے لیے آگے بڑھنے سے پہلے بولین ایکسپریشن کی جانچ کرکے قطار کی توثیق کرتی ہے۔
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)
);پہلا CHECK ایک کالم کی رکاوٹ ہے (یہ صرف stipendio سے مراد ہے)۔
نچلے حصے میں دوسرا CHECK ایک ٹیبل کی رکاوٹ ہے (یہ متعدد کالموں سے قدروں کو عبور کر سکتا ہے، اور اسے نیچے سے اعلان کیا جانا چاہیے)۔
اگر کوئی INSERT یا UPDATE آغاز سے پہلے اختتام کو محفوظ کرنے کی کوشش کرتا ہے، تو Postgres اسے غلطی کے ساتھ مسترد کر دے گا!
نام کی پابندیاں
رکاوٹوں کو ایک واضح نام دینا اکثر اچھا عمل ہے (CONSTRAINT کلیدی لفظ کا استعمال کرتے ہوئے)۔ اس طرح، جب Postgres کسی ریکارڈ کو روکتا ہے، تو غلطی آپ کو بتائے گی مثال کے طور پر "constraint 'stipendio_positivo' violated"، جو ڈیبگنگ کے لیے زیادہ واضح ہے!
CREATE TABLE prodotti (
id SERIAL PRIMARY KEY,
nome VARCHAR(50),
CONSTRAINT nome_univoco UNIQUE(nome)
);اسے آزمائیں
id (SERIAL PRIMARY KEY) اور ایک 'customer_id' (INTEGER) کے ساتھ ایک 'prenotazioni' جدول بنائیں۔ غیر ملکی کلید کی رکاوٹ کو واضح نام دینے کے لیے CONSTRAINT fk_cliente FOREIGN KEY (customer_id) حوالہ جات صارفین (id) کا استعمال کریں۔ میز کی رکاوٹ کے طور پر، اسے نیچے سے کریں۔
اشارہ دکھائیں۔
لکھیں CONSTRAINT fk_cliente FOREIGN KEY (local_column) References external_table(external_col)
3 کوششوں کے بعد حل دستیاب ہے۔
حسب ضرورت منطق کے ساتھ پابندیاں
id (SERIAL PRIMARY KEY)، posti_totali (INTEGER) اور biglietti_venduti (INTEGER) کے ساتھ ایک 'ایونٹی' ٹیبل بنائیں۔ 'check_capienza' کے نام سے ایک جدول کی رکاوٹ شامل کریں جہاں biglietti_venduti کبھی بھی posti_totali سے بڑا نہیں ہونا چاہیے۔
اشارہ دکھائیں۔
CONSTRAINT check_capienza CHECK ( اظہار ) کا استعمال کرتے ہوئے نچلے حصے میں رکاوٹ شامل کریں
3 کوششوں کے بعد حل دستیاب ہے۔