Ενότητα # 5: Περιορισμοί ακεραιότητας Βάσεις Δεδομένων Ι Ενότητα # 5: Περιορισμοί ακεραιότητας Σπυρίδων Σιούτας Τμήμα Πληροφορικής
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς.
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα Ιονίου Πανεπιστημίου» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.
Χτίζοντας τύπους δεδομένων στην SQL date: Ημ/νίες, περιέχουν (4 ψήφιο) year, month και date Παράδειγμα: date ‘2005-7-27’ time: Time of day, σε hours, minutes και seconds. Παράδειγμα : time ‘09:00:30’ time ‘09:00:30.75’ timestamp: date plus time of day Παράδειγμα: timestamp ‘2005-7-27 09:00:30.75’ interval: Χρονική Περίοδος, Χρονικό Διάστημα Παράδειγμα : interval ‘1’ day Αφαιρώντας μία date/time/timestamp τιμή από μία άλλη παίρνουμε μια τιμή interval Interval τιμές μπορούν να προστεθούν σε date/time/timestamp τιμές
Τύποι Οριζόμενοι από το Χρήστη Η δομή create type στην SQL δημιουργεί user-defined type create type Dollars as numeric (12,2) Η δομή create domain στην SQL-92 δημιουργεί user- defined domain types create domain person_name char(20) not null Types και domains είναι παρόμοια. Απλά τα Domains μπορούν να πάρουν περιορισμούς (constraints), όπως not null, κ.τ.λ.
Domain Constraints Domain constraints είναι η πιο βασική μορφή των integrity constraints. Ελέγχουν τις τιμές που μπαίνουν στη ΒΔ, καθώς και ερωτήματα (queries) για να διασφαλίσουν ότι οι συγκρίσεις (comparisons) μεταξύ τιμών μπορούν να γίνουν. Νέα domains μπορούν να δημιουργηθούν από υπάρχοντες τύπους δεδομένων (data types) Π.χ.: create domain Dollars numeric(12, 2) create domain Pounds numeric(12,2) Δεν μπορούμε να αναθέσουμε ή να συγκρίνουμε μία τιμή τύπου Dollars σε/με μία τιμή τύπου Pounds. Μπορούμε όμως να μετατρέψουμε τύπους ως εξής (cast r.A as Pounds) Μπορούμε να διαγράψουμε ένα domain Drop Domain Dollars Μπορούμε να τροποποιήσουμε το domain Dollars Alter domain Dollars numeric(10,2)
Ακεραιότητα (Integrity Constraints) Οι έλεγχοι ακεραιότητας προφυλάσσουν τη ΒΔ από απροσδόκητη βλάβη, εξασφαλίζοντας ότι εξουσιοδοτημένες ενημερώσεις – αλλαγές στη ΒΔ δεν θα προκαλέσουν απώλεια στη συνέπεια των δεδομένων (data consistency). Π.χ. Ένας ελεγχόμενος τραπεζικός λογαριασμός θα πρέπει να έχει υπόλοιπο (balance) μεγαλύτερο από $10,000.00 Το ωρομίσθιο ενός τραπεζικού υπαλλήλου θα πρέπει να είναι τουλάχιστον $4.00 Κάθε πελάτης θα πρέπει να έχει έναν μη-κενό (non-null) αριθμό τηλεφώνου …..κ.τ.λ.
Περιορισμοί (Constraints) σε μία απλή Σχέση not null primary key unique check (P ), where P is a predicate
Not Null Constraint Δηλώνω το πεδίο branch_name του πίνακα / σχέσης branch να είναι not null branch_name char(15) not null Δηλώνω το domain Dollars να είναι not null create domain Dollars numeric(12,2) not null
The Unique Constraint unique ( A1, A2, …, Am) Η δήλωση unique εκφράζει ότι οι ιδιότητες (attributes) A1, A2, … Am Διαμορφώνουν ένα candidate key. Τα Candidate keys επιτρέπεται να είναι null (σε αντίθεση με τα primary keys).
Η δομή check check (P ), where P is a predicate Παράδειγμα: Δήλωσε το branch_name ως το primary key της σχέσης branch και εξασφάλισε ότι οι τιμές του πεδίου assets είναι μη-αρνητικές. create table branch (branch_name char(15), branch_city char(30), assets integer, primary key (branch_name), check (assets >= 0))
Η δομή check (Συν.) Η δομή check της SQL-92 επιτρέπει περιορισμούς σε domains: Χρησιμοποίησε check δομή για να διασφαλίσεις ότι το hourlywage domain επιτρέπει τιμές μεγαλύτερες από μία προκαθορισμένη τιμή. create domain hourlywage numeric(5,2) constraint value_wage_test check(value > = 4.00) Το domain έχει ένα constraint το οποίο διασφαλίζει ότι το hourlywage είναι μεγαλύτερο από 4.00 Η δομή constraint value_wage_test είναι μη-δεσμευτική (optional), χρήσιμη όμως για να υποδείξει τυχόν παραβιάσεις μετά από κάποια ενημέρωση (update violations) Συγκεκριμένα, το όνομα value_wage_test χρησιμοποιείται από τον SQL Server για να εμφανίσει ο τελευταίος τον περιορισμό που παραβίασε μία ενημέρωση στη Βάση Δεδομένων.
Η δομή check (Συν.) Ένα άλλο παράδειγμα: create domain AccountNumber char (10) constraint account_number_null_test check(value not null) Στη σχέση account πρέπει να μπει ο ακόλουθος περιορισμός: Check (branch_name in (select branch_name from branch) Ο οποίος επαληθεύει ότι το branch_name σε κάθε εγγραφή της σχέσης account είναι στην πραγματικότητα το όνομα ενός υποκαταστήματος στη σχέση branch. Έτσι η συνθήκη θα πρέπει να ελεγχθεί, όχι μόνο όταν εισάγεται ή τροποποιείται μία εγγραφή στο account, αλλά επίσης όταν η σχέση branch υποστεί αλλαγή (Δες στη συνέχεια referential integrity)
Ακεραιότητα Αναφορών (Referential Integrity) Εξασφαλίζει ότι μία τιμή που εμφανίζεται σε μία σχέση εμφανίζεται επίσης για ένα συγκεκριμένο σύνολο χαρακτηριστικών (attributes) σε μία άλλη σχέση. Παράδειγμα: Αν “Perryridge” είναι το όνομα του υποκαταστήματος σε μία από τις γραμμές (tuples) της σχέσης account, τότε υπάρχει tuple στη σχέση branch για το υποκατάστημα “Perryridge”. Primary και foreign keys μπορούν να οριστούν στην εντολή SQL create table: Το primary key συντίθεται από μία λίστα χαρακτηριστικών που ορίζουν μοναδικά ένα tuple. To foreign key εξ’ ορισμού αναφέρεται στο primary key του αναφερόμενου πίνακα (referenced table).
Ακεραιότητα Αναφορών στην SQL – Παράδειγμα create table customer (customer_name char(20), customer_street char(30), customer_city char(30), primary key (customer_name )) create table branch (branch_name char(15), branch_city char(30), assets numeric(12,2), // or Dollars // primary key (branch_name ), check (assets >= 0))
Ακεραιότητα Αναφορών στην SQL – Παράδειγμα (Συν.) create table account (account_number char(10), // or AccountNumber // branch_name char(15), balance integer, primary key (account_number), foreign key (branch_name) references branch on delete cascade, on update cascade) Εξ’ αιτίας του όρου on delete cascade που σχετίζεται με τη δήλωση του ξένου κλειδιού, αν η διαγραφή μιας εγγραφής στη σχέση branch καταλήξει να παραβιάζεται αυτός ο περιορισμός ακεραιότητας αναφορών, το σύστημα δεν απορρίπτει τη διαγραφή. Αντίθετα, η διαγραφή μεταφέρεται διαδοχικά στη σχέση account, διαγράφοντας την εγγραφή που αναφέρεται στο υποκατάστημα που διαγράφηκε. Παρομοίως, εξαιτίας του όρου on update cascade το σύστημα ενημερώνει το πεδίο branch_name στις αναφερόμενες εγγραφές του account με τη νέα τιμή.
Ακεραιότητα Αναφορών στην SQL – Παράδειγμα (Συν.) create table depositor (customer_name char(20), account_number char(10), primary key (customer_name, account_number), foreign key (customer_name ) references customer on delete cascade, on update cascade), foreign key (account_number ) references account on update cascade), check (assets >= 0))
Ακεραιότητα Αναφορών στην SQL ON UPDATE/ DELETE CASCADE: Διαγραφή ή ενημέρωση πλειάδας από τον γονικό πίνακα αναφοράς οδηγεί σε αυτόματη διαγραφή ή ενημέρωση των αντίστοιχων πλειάδων στον πίνακα παιδί SET NULL: Διαγραφή ή ενημέρωση πλειάδας από το γονικό πίνακα οδηγεί σε ανάθεση της τιμής NULL στον πίνακα παιδί. RESTRICT: Διαγραφή ή ενημέρωση στο γονικό πίνακα δε γίνεται αποδεκτή (προεπιλεγμένη τιμή – default) NO ACTION: Διαγραφή ή ενημέρωση της τιμής του πρωτεύοντος κλειδιού, απορρίπτεται εάν υπάρχει ξένο κλειδί στον πίνακα παιδί. https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html
Ακεραιότητα Αναφορών στην SQL – Παράδειγμα (Συν.) create table loan (loan_number char(20), branch_name char(15), amount integer, primary key (loan_number), foreign key (branch_name ) references branch on delete cascade, on update cascade), check (amount >= 0))
Ακεραιότητα Αναφορών στην SQL – Παράδειγμα (Συν.) create table borrower (customer_name char(20), loan_number char(10), primary key (customer_name, loan_number), foreign key (customer_name ) references customer on delete cascade, on update cascade), foreign key (loan_number ) references loan on update cascade))
Τέλος Ενότητας