Cunoștințe, prelegere, mijloace de definire a tabelelor de bază și a constrângerilor de integritate


Fig. 12.2. Ierarhia tipurilor de constrângeri de integritate

Constrângere integritate. care fac parte din definiția unui domeniu, sunt moștenite de toate coloanele definite pe aceste domenii și sunt restricțiile acestor coloane. În plus, definițiile coloanei pot include definiții ale constrângerilor suplimentare. Constrângere integritate. (inclusiv restricțiile moștenite din definiția domeniului) sunt constrângerile tabelului, definirea cărora include definiția acestei coloane. În plus, definițiile tabelului pot include definiții ale constrângerilor suplimentare.







Dar ierarhia tipurilor de constrângeri de integritate nu este epuizată de acest lucru. Constrângere integritate. Tabelele incluse în definiția tabelului (inclusiv coloanele explicite și moștenite din definiția domeniului) sunt restricții ale bazei de date. din care face parte acest tabel. În plus, pot fi definite restricții adiționale la baza de date. În standardul SQL, astfel de restricții adiționale la baza de date sunt numite ASSERTION. și le vom numi constrângeri generale de integritate.

Definirea constrângerilor comune de integritate

Pentru a determina constrângerea generală a integrității, utilizați instrucțiunea CREATE ASSERTION. definite în următoarea sintaxă:

Definiția tabelului EMP conținea constrângerea coloanei EMP_BDATE:

În condiția logică a acestei constrângeri generale este selectată valoarea minimă a coloanei EMP_BDATE (cea mai veche data de naștere a angajatului). Valoarea expresiei condiționate va fi falsă dacă și numai dacă există cel puțin unul dintre angajații care au fost născuți înainte de data specificată.

Acum reformulăm constrângerea tabelului EMP PRO_EMP_NO ca o constrângere generală de integritate. care a fost definită după cum urmează:

(mai mult de 50 de angajați nu pot lucra la un proiect).

Iată formularea unei constrângeri totale de integritate echivalente:

O expresie booleană a acestei constrângeri nu poate avea decât valori adevărate și false. Operatorul de selecție internă grupă rândurile tabelului EMP astfel încât toate rândurile cu aceeași valoare a coloanei PRO_NO să cadă într-un singur grup. Aceste grupuri sunt apoi filtrate în conformitate cu clauza HAVING. și rămân doar grupuri de mai mult de 50 de linii. Tabelul rezultat conține rânduri dintr-o coloană care conține valoarea PRO_NO a celorlalte grupuri. Predicatul NOT EXISTS este adevărat dacă și numai dacă acest tabel de rezultate nu conține rânduri, adică nu există niciun proiect cu mai mult de 50 de angajați.

Arătăm cum poate fi formulată o constrângere a cheilor străine ca o constrângere generală de integritate. De exemplu, aici este o formulare echivalentă pentru determinarea cheii străine PRO_NO. care face parte din definiția tabelului EMP:

Ca o constrângere generală de integritate, aceasta ar putea arăta astfel:

Expresia logică a acestei restricții pare destul de complicată și necesită clarificare. Instrucțiunea SELECT pe linie (2) constă din două părți, legate de AND. Prima parte filtrează acele rânduri din tabelul EMP. care au o coloana NULL în coloana PRO_NO. Dacă această coloană conține NULL în toate rândurile tabelului, tabela de rezultate a instrucțiunii select pe linie (2) va fi goală și valoarea predicatului NOT EXISTS va fi adevărată. adică, restricția este satisfăcută.

Să presupunem că tabelul emp a găsit un șir emp. Coloana PRO_NO conține o valoare diferită de NULL. Apelați această valoare cand_pro_no. Pentru aceasta, este evaluată a doua parte a condiției de selecție a instrucțiunii SELECT pe linie (2). Operatorul de selecție pe linia (3) selectează toate rândurile tabelului PRO. valoarea coloanei PRO_NO din care este egală cu cand_pro_no. Dacă această valoare a fost găsit cand_pro_no cel puțin un astfel de șir, tabela rezultat al operatorului pe linia de eșantion (3) este non-gol, și NU EXISTS valoare predicat la linia (3) este falsă. În consecință, întreaga condiție de selecție a primei instrucțiuni SELECT va fi falsă. iar șirul cu valoarea cand_pro_no din coloana PRO_NO va fi filtrat. 16 Aceasta înseamnă că cand_pro_no este o valoare cheie valabilă străină.







Dacă există cel puțin un rând din tabelul EMP cu o valoare de cand_pro_no a coloanei PRO_NO. că în tabelul PRO nu există un singur rând, valoarea coloanei PRO_NO din care ar fi egală cu acest cand_pro_no. atunci tabelul de rezultate al operatorului de selecție pe linia (3) va fi gol și valoarea predicatului NOT EXISTS pe linia (3) va fi adevărată. Atunci întreaga condiție de selecție a primei instrucțiuni SELECT va fi adevărată. iar acest rând al tabelului EMP va fi sărit în tabela de rezultate. Valoarea predicatului NOT EXISTS este falsă. adică restricția nu este satisfăcută.

Am adus în mod deliberat o explicație atât de detaliată nu numai pentru a clarifica semnificația expresiei condiționate a constrângerii generale de integritate FK_PRO_NO. dar, de asemenea, pentru a clarifica ceea ce construcția sintactică simplă a definiției cheii externe într-adevăr degenerează. După cum arată experiența, mulți inițiatori de baze de date orientați spre SQL consideră că constrângerile referențiale sunt la fel de ușor de întreținut așa cum au fost definite.

În final, formulăm o constrângere generală de integritate, ceea ce înseamnă că niciun manager de proiect nu ar trebui să aibă un venit total total, mai mare decât venitul total al managerului departamentului în care acesta lucrează.

În expresia logică a acestei restricții, se selectează selectorul SELECT. în secțiunea din lista de tabele (FROM) pentru prima dată în acest curs se utilizează mai multe tabele. Astfel de interogări în SQL se numesc interogări cu conexiuni și vom folosi cazul pentru a explica prin exemplu (bineînțeles, în prealabil) modul în care acestea trebuie înțelese în conformitate cu limbajul standard SQL.

Astfel, în secțiunea FROM a operatorului de eșantionare utilizat în starea logică a acestei constrângeri, patru elemente sunt enumerate printr-o virgulă - EMP EMP1. EMP EMP2. DEPT și PRO. O expresie a formularului EMP ANOTHER_NAME înseamnă aplicarea unei operațiuni de redenumire. În interiorul interogării, coloanele acestei "instanțe" a EMP au nume calificate ale formularului ANOTHER_NAME.column_name. unde column_name este numele unei coloane existente în tabelul EMP.

Calculul operatorului de eșantionare începe cu faptul că se formează un produs cartesian extins din toate tabelele specificate în clauza FROM. În acest caz, schema tabelului rezultat din clauza FROM va conține următoarele nume de coloane: EMP1.EMP_NO. EMP1.EMP_NAME. Emp1. EMP_BDATE. Emp1. EMP_SAL. EMP1.EMP_BONUS. Emp1. DEPT_NO. Emp1. PRO_NO. EMP2.EMP_NO. EMP2.EMP_NAME. EMP2. EMP_BDATE. EMP2. EMP_SAL. EMP2.EMP_BONUS. EMP2. DEPT_NO. EMP2. PRO_NO. DEPT.DEPT_NO. DEPT.DEPT_EMP_NO. DEPT.DEPT_TOTAL_SAL. DEPT.DEPT_MNG. PRO .PRO_NO. PRO.PRO_TITLE. PRO.PRO_SDATE. PRO .PRO_DURAT. PRO .PRO_MNG. PRO_DESC. Pentru comoditate, să numim această masă "largă" ALL_TOGETHER. 17 Nu luați acest lucru și paragrafele următoare ca o descriere a modului în care aceste interogări sunt efectiv efectuate în serverele SQL. Aceasta este modalitatea cea mai simplă și ineficientă de a îndeplini o cerere (deși, în principiu, aceasta poate fi aplicată în practică). Am ales această metodă de descriere, deoarece corespunde abordării descrierii semanticii limbajului SQL utilizat în standardul limbajului. Apropo, principala diferență dintre modalitățile mai practice de a efectua interogări cu o conexiune este dorința de a evita produsul cartezian explicit.

Condiția clauzei WHERE este formată din patru părți, legate de AND. Vom discuta în mod consecvent. După verificarea stării EMP1.EMP_NO = PRO .PRO_MNG tabel ALL_TOGETHER rămân toate proiectele care deservesc managerii cu proiectele lor, în combinație cu toate departamentele și toți angajații potențiali (le numim acest tabel filtrat ALL_TOGETHER_STEP1). După verificarea stării EMP1.DEPT_NO = DEPT.DEPT_NO în tabelul ALL_TOGETHER_STEP1 va servi toți managerii de proiecte, împreună cu proiectele lor, și împreună cu o descriere a departamentelor sale, în combinație cu toți angajații (noi numim acest tabel filtrat ALL_TOGETHER_STEP2). După verificarea stării DEPT.DEPT_MNG = EMP2.EMP_NO în tabelul ALL_TOGETHER_STEP2 va servi toți managerii de proiecte, împreună cu proiectele lor, împreună cu o descriere a departamentelor lor și, împreună cu șefii acestor departamente (câte un rând pentru fiecare combinație posibilă de „proiect-menedzher_proekta-otdel_menedzhera_proekta- manager_of_project_manager_project "). Denumim acest tabel filtrat ALL_TOGETHER_STEP3. Este ușor de observat că, după verificarea stării EMP1.EMP_SAL + EMP1.EMP_BONUS> EMP2.EMP_SAL + EMP2.EMP_BONUS ALL_TOGETHER_STEP3 în tabel pot sta-line doar proiect menedzher_proekta-otdel_menedzhera_proekta-rukovoditel_otdela_menedzhera_proekta. în care totalul venitului managerului de proiect depășește venitul total al șefului departamentului în care lucrează managerul de proiect. În cazul în care există cel puțin un astfel de rând, atunci rezultatul operatorului de eșantionare este non-gol, NU EXISTS valoare predicatul este fals. prin urmare, constrângerea de integritate PRO_MNG_CONSTR va fi încălcată.







Trimiteți-le prietenilor: