முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 9 · பாடம் 2 இன் 4பாடத்திட்டத்தில் 34/57~12 min
தொகுதி பாடங்கள் (2/4)

பல மற்றும் அட்டவணை-நிலை கட்டுப்பாடுகள்

தரவுத்தளத்தில் உள்ள தரவு மிகவும் அடிப்படையான அடுக்கில் ("தரவு ஒருமைப்பாடு") சரியாக இருப்பதை உறுதி செய்வது அடிப்படையானது. நீங்கள் Node.js பயன்பாட்டில் பாதுகாப்பை மட்டும் எழுதினால், பிழைகள் DB இல் சீரற்ற தரவை ஏற்படுத்தலாம். டிடிஎல் மட்டத்தில் உள்ள கட்டுப்பாடுகள் கடைசி, ஊடுருவ முடியாத பாதுகாப்புக் கோடு.

முக்கிய தடைகள்

PRIMARY KEY (இது ஒரு நெடுவரிசையை தனித்துவமாக்குகிறது மற்றும் பூஜ்யமாக இல்லை) மற்றும் கிளாசிக் NOT NULL மற்றும் UNIQUE ஆகியவற்றுடன் கூடுதலாக, தரவின் தருக்க நிலைத்தன்மைக்கு இரண்டு அடிப்படை வகைகள் உள்ளன:

1. வெளிநாட்டு விசை (குறிப்பு ஒருமைப்பாடு)

ஒரு REFERENCES தடையானது, அது சுட்டிக்காட்டும் "பெற்றோர்" அட்டவணையில் இணைக்கும் ஐடி உண்மையில் இருப்பதை உறுதி செய்கிறது. எடுத்துக்காட்டாக, ஒரு ஆர்டர் இருக்கும் வாடிக்கையாளருடன் இணைக்கப்பட வேண்டும்.

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

வெளிநாட்டு விசை என்ன செய்கிறது?

  • customers இல் இல்லாத customer_id ஐச் செருகுவதிலிருந்து இது உங்களைத் தடுக்கிறது.
  • customers இலிருந்து ஒரு வாடிக்கையாளருக்கு ஆர்டர்கள் இருந்தால், அது உங்களை DELETE (நீக்குதல்) தடுக்கிறது (இது "அனாதை" பதிவுகளிலிருந்து பாதுகாக்கிறது).

"பெற்றோர்" நீக்கப்பட்டால் என்ன நடக்க வேண்டும் என்பதையும் நாம் தீர்மானிக்கலாம்:

SQL
customer_id INTEGER REFERENCES customers(id) ON DELETE CASCADE

ON DELETE CASCADE உடன், நாம் வாடிக்கையாளரை நீக்கினால், Postgres தானாகவே இணைக்கப்பட்ட orders அனைத்தையும் அகற்றும்! (மிகவும் எச்சரிக்கையுடன் பயன்படுத்தவும்; பொதுவாக செயல்பாட்டைத் தடுக்கும் இயல்புநிலை அமைப்பு விரும்பத்தக்கது.)

2. கட்டுப்பாடுகளை சரிபார்க்கவும்

ஒரு CHECK கட்டுப்பாடு சேமிப்பதைத் தொடர்வதற்கு முன் பூலியன் வெளிப்பாட்டை சோதிப்பதன் மூலம் வரிசையைச் சரிபார்க்கிறது.

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

முதல் CHECK என்பது நெடுவரிசைக் கட்டுப்பாடு (இது stipendio ஐ மட்டுமே குறிக்கிறது). கீழே உள்ள இரண்டாவது CHECK ஆனது அட்டவணைக் கட்டுப்பாடு (இது பல நெடுவரிசைகளிலிருந்து மதிப்புகளைக் கடக்கும், மேலும் கீழே அறிவிக்கப்பட வேண்டும்).

ஒரு INSERT அல்லது UPDATE தொடக்கத்திற்கு முன் முடிவைச் சேமிக்க முயற்சித்தால், Postgres அதை பிழையுடன் நிராகரிக்கும்!

பெயரிடும் கட்டுப்பாடுகள்

கட்டுப்பாடுகளுக்கு வெளிப்படையான பெயரை வழங்குவது பெரும்பாலும் நல்ல நடைமுறையாகும் (CONSTRAINT முக்கிய சொல்லைப் பயன்படுத்தி). இந்த வழியில், Postgres ஒரு பதிவைத் தடுக்கும் போது, ​​பிழையானது "stipendio_positivo' என்ற கட்டுப்பாடு மீறப்பட்டது" என்று உங்களுக்குச் சொல்லும், இது பிழைத்திருத்தத்திற்கு மிகவும் தெளிவானது!

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

முயற்சி செய்து பாருங்கள்

உடற்பயிற்சி#sql.m9.l2.e1
முயற்சிகள்: 0ஏற்றுகிறது…

ஐடி (சீரியல் பிரைமரி கீ) மற்றும் ஒரு 'கஸ்டமர்_ஐடி' (INTEGER) உடன் 'prenotazioni' அட்டவணையை உருவாக்கவும். வெளிநாட்டு விசை தடைக்கு வெளிப்படையான பெயரை வழங்க, CONSTRAINT fk_cliente FOREIGN KEY (customer_id) References வாடிக்கையாளர்கள்(id) ஐப் பயன்படுத்தவும். கீழே அதை ஒரு அட்டவணை கட்டுப்பாடாக செய்யுங்கள்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

CONSTRAINT fk_cliente FOREIGN KEY (local_column) குறிப்புகள் வெளிப்புற_அட்டவணை (external_col) எழுதவும்

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

தனிப்பயன் தர்க்கத்துடன் கூடிய கட்டுப்பாடுகள்

உடற்பயிற்சி#sql.m9.l2.e2
முயற்சிகள்: 0ஏற்றுகிறது…

ஐடி (வரிசை முதன்மை விசை), posti_totali (INTEGER) மற்றும் biglietti_venduti (INTEGER) ஆகியவற்றைக் கொண்டு 'eventi' அட்டவணையை உருவாக்கவும். 'check_capienza' என்ற அட்டவணைக் கட்டுப்பாட்டைச் சேர்க்கவும், அங்கு biglietti_venduti ஒருபோதும் posti_totali ஐ விட அதிகமாக இருக்கக்கூடாது.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

CONSTRAINT check_capienza CHECK ( வெளிப்பாடு ) ஐப் பயன்படுத்தி கீழே உள்ள தடையைச் சேர்க்கவும்

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்