మాడ్యూల్ పాఠాలు (2/4)
బహుళ మరియు పట్టిక-స్థాయి పరిమితులు
డేటాబేస్లోని డేటా అత్యంత ప్రాథమిక లేయర్లో ("డేటా సమగ్రత") సరైనదని నిర్ధారించడం ప్రాథమికమైనది. మీరు Node.js అప్లికేషన్లో భద్రతను మాత్రమే వ్రాస్తే, బగ్లు DBలో అస్థిరమైన డేటాకు కారణం కావచ్చు. DDL స్థాయిలో పరిమితులు రక్షణ యొక్క చివరి, అభేద్యమైన లైన్.
ప్రధాన పరిమితులు
PRIMARY KEY (ఇది నిలువు వరుసను ప్రత్యేకంగా చేస్తుంది మరియు శూన్యమైనది కాదు) మరియు క్లాసిక్ NOT NULL మరియు UNIQUEతో పాటు, డేటా యొక్క తార్కిక అనుగుణ్యత కోసం రెండు ప్రాథమిక వర్గాలు ఉన్నాయి:
1. ఫారిన్ కీ (రిఫరెన్షియల్ ఇంటెగ్రిటీ)
ఒక REFERENCES పరిమితి అది సూచించే "తల్లిదండ్రుల" పట్టికలో నిజంగా లింకింగ్ ID ఉందని నిర్ధారిస్తుంది.
ఉదాహరణకు, ఒక ఆర్డర్ తప్పనిసరిగా existing కస్టమర్కి లింక్ చేయబడాలి.
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INTEGER REFERENCES customers(id)
);విదేశీ కీ ఏమి చేస్తుంది?
- ఇది
customersలో లేనిcustomer_idని చొప్పించకుండా మిమ్మల్ని నిరోధిస్తుంది. - ఇది
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 ప్రారంభానికి ముందు ముగింపును సేవ్ చేయడానికి ప్రయత్నిస్తే, పోస్ట్గ్రెస్ లోపంతో దాన్ని తిరస్కరిస్తుంది!
నామకరణ పరిమితులు
పరిమితులకు స్పష్టమైన పేరు (CONSTRAINT కీవర్డ్ ఉపయోగించి) ఇవ్వడం తరచుగా మంచి పద్ధతి. ఈ విధంగా, పోస్ట్గ్రెస్ రికార్డ్ను బ్లాక్ చేసినప్పుడు, లోపం మీకు ఉదాహరణకు "స్టిపెండియో_పోజిటివో' పరిమితిని ఉల్లంఘించబడింది" అని చెబుతుంది, ఇది డీబగ్గింగ్ కోసం చాలా స్పష్టంగా ఉంటుంది!
CREATE TABLE prodotti (
id SERIAL PRIMARY KEY,
nome VARCHAR(50),
CONSTRAINT nome_univoco UNIQUE(nome)
);దీనిని ప్రయత్నించండి
id (సీరియల్ ప్రైమరీ కీ) మరియు 'కస్టమర్_ఐడి' (INTEGER)తో 'ప్రెనోటాజియోని' పట్టికను సృష్టించండి. విదేశీ కీ పరిమితికి స్పష్టమైన పేరును ఇవ్వడానికి CONSTRAINT fk_cliente FOREIGN KEY (customer_id) రిఫరెన్స్ కస్టమర్లు(id)ని ఉపయోగించండి. టేబుల్ నిర్బంధంగా దిగువన చేయండి.
సూచనను చూపించు
CONSTRAINT fk_cliente FOREIGN KEY (local_column) రిఫరెన్సెస్ బాహ్య_పట్టిక (external_col)ని వ్రాయండి
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది
అనుకూల తర్కంతో పరిమితులు
id (SERIAL PRIMARY KEY), posti_totali (INTEGER) మరియు biglietti_venduti (INTEGER)తో 'eventi' పట్టికను సృష్టించండి. 'check_capienza' అనే పట్టిక నిర్బంధాన్ని జోడించండి, ఇక్కడ biglietti_venduti posti_totali కంటే ఎక్కువగా ఉండకూడదు.
సూచనను చూపించు
CONSTRAINT check_capienza CHECK ( వ్యక్తీకరణ ) ఉపయోగించి దిగువన పరిమితిని జోడించండి
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది