Κεφάλαιο 2. Δημιουργία Βάσης Δεδομένων και Πινάκων
2.1. Ορισμός και Δημιουργία μιας Βάσης Δεδομένων
2.1.1. Δημιουργία νέας βάσης σε γραφικό περιβάλλον
2.1.2. Δημιουργία νέας βάσης με κώδικα SQL
2.1.3. Διαγραφή μίας βάσης με κώδικα SQL
2.2. Βασικές Έννοιες και Δημιουργία Πινάκων
2.2.1. Τύποι Δεδομένων
2.2.2. Χρήσιμες συμβουλές για τους τύπους δεδομένων
2.2.3. Δημιουργία πινάκων με τον Management Studio
2.2.4. Δημιουργία πινάκων με κώδικα της SQL
2.2.5. Συσχετίσεις/Relationships Πινάκων
2.2.6 Δημιουργία πινάκων με τον Database Diagrams
2.3. Εισαγωγή εγγραφών στους πίνακες
2.3.1. Εισαγωγή εγγραφών στους πίνακες με γραφικό τρόπο
2.3.2. Εισαγωγή εγγραφών στους πίνακες με εντολές SQL
2.4. Αλλαγή σε δεδομένα πινάκων
2.4.1. Ενημέρωση δεδομένων
2.4.2. Διαγραφή δεδομένων
2.5. Κώδικας SQL για τη δημιουργία της βάσης δεδομένων DVDclub
2.6. Ασκήσεις
2.7. Βιβλιογραφία/Αναφορές
Κεφάλαιο 2. Δημιουργία Βάσης Δεδομένων και Πινάκων
Σύνοψη
Σ’ αυτό το κεφάλαιο θα δημιουργήσουμε μια βάση δεδομένων που αφορά ένα κατάστημα ενοικίασης ψηφιακών δίσκων με το όνομα DVDClub. Θα εργαστούμε, κυρίως, με εντολές από την γλώσσα ορισμού δεδομένων (Data Definition Language). Θα συζητήσουμε για τους διαφορετικούς τύπους δεδομένων και τον τρόπο δημιουργίας πινάκων, με γραφικό τρόπο και με κώδικα. Τέλος, θα δημιουργήσουμε συσχετίσεις μεταξύ των πινάκων στο Database diagram και θα εισάγουμε τιμές στους πίνακες.
Πίνακας Περιεχομένων / Περιεχόμενα Κεφαλαίου
2.1. Ορισμός και Δημιουργία μιας Βάσης Δεδομένων
Ο SQL Server είναι ένα σύστημα διαχείρισης βάσεων δεδομένων (database management system). Ως εκ τούτου, υποστηρίζει όλες τις λειτουργίες που πρέπει να προσφέρει μια βάση δεδομένων, όπως είναι η αναζήτηση, η εισαγωγή, η διαγραφή, η ενημέρωση εγγραφών κλπ. Η βάση δεδομένων είναι μια συλλογή στοιχείων που σχετίζονται μεταξύ τους και είναι καταχωρημένα με κατάλληλα δομημένο τρόπο. Συγκεκριμένα, μια βάση δεδομένων χαρακτηρίζεται ως σχεσιακή, όταν το βασικό δομικό στοιχείο της είναι η σχέση ή, αλλιώς, ο πίνακας, ο οποίος διέπεται από συγκεκριμένες ιδιότητες (μοναδικότητα κάθε εγγραφής, ατομικότητα τιμών κτλ.). Ο SQL Server παρέχει δύο μεθόδους για να δημιουργήσετε μια βάση δεδομένων:
Στη συνέχεια, χρησιμοποιώντας και τις δύο μεθόδους, θα δημιουργήσουμε τη βάση δεδομένων και τους πίνακες ενός DVDclub που θα διέπεται από τους παρακάτω κανόνες της ανάλυσης απαιτήσεων:
Βάσει της παραπάνω ανάλυσης απαιτήσεων, ακολουθεί το διάγραμμα οντοτήτων-συσχετίσεων που δίνεται στην Εικόνα 2.1..
Εικόνα 2.1
Συνολικά, το διάγραμμα Οντοτήτων-Συσχετίσεων (Ο-Σ) αποτελείται από 5 οντότητες (ΠΕΛΑΤΗΣ, ΔΙΣΚΟΣ, ΤΑΙΝΙΑ, ΣΥΝΤΕΛΕΣΤΗΣ, ΡΟΛΟΣ),και τρεις συσχετίσεις (Ενοικιάζει, Αποθηκεύεται, Τ_Σ_Ρ). Από αυτές τις συσχετίσεις, οι δύο (Ενοικιάζει και Τ_Σ_Ρ) συσχετίζουν οντότητες με συσχέτιση πολλά προς πολλά και, ως εκ τούτου, πρέπει να αναχθούν σε συσχετιστικές οντότητες στο σχεσιακό σχήμα, με αποτέλεσμα να προκύπτουν συνολικά επτά πίνακες δεδομένων, όπως φαίνεται στην Εικόνα 2.2. Σύμφωνα με τη θεωρία των Βάσεων Δεδομένων, το E-R διάγραμμα αντιστοιχίζεται με το σχεσιακό σχήμα της Εικόνας 2.2, που αποτελείται από επτά σχέσεις: μία για κάθε οντότητα και από μία για τις συσχετίσεις M:N και M:N:K. Η συσχέτιση 1:Ν ενσωματώνεται στη σχέση που προκύπτει από την οντότητα ΔΙΣΚΟΣ. Τέλος, τονίζουμε ότι στις επόμενες ενότητες θα παρουσιάσουμε βήμα-βήμα την δημιουργία της βάσης δεδομένων DVDclub βάσει του σχεσιακού σχήματος της Εικόνας 2.2.
Εικόνα 2.2 Σχεσιακό Σχήμα του DVDclub
Πίνακας Περιεχομένων / Περιεχόμενα Κεφαλαίου
2.1.1. Δημιουργία νέας βάσης σε γραφικό περιβάλλον
Με δεξί κλικ πάνω στο φάκελο Databases επιλέγουμε “New Database…”.
Εικόνα 2.3
Δίνουμε το όνομα της βάσης δεδομένων μας (DVDclub), όπως φαίνεται στην
Εικόνα 2.4.
Εικόνα 2.4
Δημιουργούνται δύο αρχεία: το primary και το transaction log. Το κύριο αρχείο δεδομένων έχει επέκταση .mdf ενώ το transaction log έχει την επέκταση .ldf. Τονίζεται ότι και τα δύο αρχεία δημιουργούνται αυτόματα και παίρνουν το όνομα της βάσης δεδομένων ως πρόθεμα. Μπορούμε να αποδεχθούμε το όνομα ή να πληκτρολογήσουμε ένα διαφορετικό. Στο κύριο αρχείο αποθηκεύονται τα δεδομένα της βάσης δεδομένων, ενώ στο transaction log file τηρούνται οι τελευταίες μεταβολές που έγιναν στην βάση δεδομένων, προκειμένου να δοθεί η δυνατότητα επαναφοράς της σε περίπτωση βλάβης του συστήματος. Κάνοντας κλικ στην επιλογή «Options» εμφανίζεται η Εικόνα 2.4, οπότε μπορούμε να καθορίσουμε τις πιο εξειδικευμένες ρυθμίσεις που εμφανίζονται στην Εικόνα 2.5.
Οι πιο σημαντικές είναι οι παρακάτω:
Compatibility level: Αν θέλουμε να μεταφέρουμε την βάση δεδομένων που θα φτιάξουμε ή αν θέλουμε να είναι προσβάσιμη από άλλες εφαρμογές που δεν έχουν την δυνατότητα να συνδεθούν στο SQL Server 2014, τότε μπορούμε να επιλέξουμε συμβατότητα με προηγούμενες εκδόσεις (Compatibility level).
Εικόνα 2.5
Recovery Model: Η ρύθμιση αφορά τον τύπο των αντιγράφων ασφαλείας. Όπως φαίνεται στην Εικόνα 2.6, το μοντέλο Simple ελαχιστοποιεί το transactions log file και αποθηκεύει τα δεδομένα απευθείας στο primary file. Έτσι, δεν δίνεται η δυνατότητα να επιστρέψουμε σε μια προηγούμενη χρονική στιγμή της βάσης δεδομένων, παρά μόνο στην τελευταία. Αντιθέτως, το μοντέλο Full δίνει την δυνατότητα να επιστρέψουμε σε οποιαδήποτε χρονική στιγμή της βάσης δεδομένων μας. Βέβαια, το μοντέλο αυτό απαιτεί να τηρούνται και τα ανάλογα back-ups του log file και καταλαμβάνει περισσότερο χώρο στο δίσκο.
Εικόνα 2.6
Για να αποθηκευτεί η βάση δεδομένων μας (DVDclub), κάνουμε κλικ στο κουμπί ΟΚ (βλέπε Εικόνα 2.4). Τώρα, κάνοντας δεξί κλικ πάνω στη βάση δεδομένων μας, βλέπουμε τις διαθέσιμες ενέργειες που εμφανίζονται στην Εικόνα 2.7, όπως π.χ. η διαγραφή της ΒΔ με την επιλογή Delete.
Εικόνα 2.7
Στην επιλογή «Properties» μπορούμε να αλλάξουμε τις βασικές ρυθμίσεις που ορίσαμε κατά τη δημιουργία της. Ακόμη, το υπομενού Tasks παρέχει χρήσιμες επιλογές, όπως φαίνονται στην Εικόνα 2.8.
Εικόνα 2.8
Πιο σημαντική είναι η διαδικασία του «Back Up», κατά την οποία θα επιλέξουμε το όνομα του αρχείου, προκειμένου να αποθηκεύεται κάθε φορά ένα αρχείο με κατάληξη «bak» που θα περιέχει όλα τα δεδομένα της βάσης μας. Μια άλλη χρήσιμη επιλογή είναι το “Restore”, όταν θέλουμε να επαναφέρουμε μια βάση δεδομένων από ένα αρχείο .bak (backup).
Η επιλογή “detach” ουσιαστικά κάνει κατ’ αναλογία την επιλογή cut όταν εργαζόμαστε με αρχεία. Δηλαδή το αρχείο mdf θα αποκοπεί και θα σβηστεί από το περιβάλλον εργασίας μας, με σκοπό να μεταφερθεί με την επιλογή Databases – Attach σε κάποιον άλλο υπολογιστή. Τέλος, η επιλογή Shrink επιχειρεί να μειώσει τον αποθηκευτικό χώρο που καταλαμβάνει μία βάση δεδομένων, χωρίς απώλεια δεδομένων.
Πίνακας Περιεχομένων / Περιεχόμενα Κεφαλαίου
2.1.2. Δημιουργία νέας βάσης με κώδικα SQL
Εναλλακτικά, η δημιουργία της βάσης δεδομένων μπορεί να επιτευχθεί με τη χρήση της γλώσσας SQL. Κάνοντας κλικ στην εργαλειοθήκη στο κουμπί «New Query» επιλέγουμε να δημιουργήσουμε ένα νέο ερώτημα SQL, το οποίο θα εκτελεστεί στη βάση δεδομένων master του συστήματος. Στη συνέχεια, θα πληκτρολογήσουμε στον Query Editor την εντολή: create database
dvdclub.Αφού ολοκληρώσουμε τη σύνταξη του ερωτήματος δημιουργίας βάσης, θα εκτελέσουμε τον κώδικα SQL είτε κάνοντας κλικ στο κουμπί “Execute” είτε πατώντας F5 στο πληκτρολόγιο, όπως φαίνεται στην Εικόνα 2.10.
Αφού δημιουργήσουμε τη βάση δεδομένων, επιλέγουμε Generate Scripts από το αναδυόμενο μενού της Εικόνας 2.8 και, έτσι, φανερώνεται ένας οδηγός όπου αυτόματα παράγονται οι ανάλογες εντολές SQL, οι οποίες μπορούν να δημιουργήσουν τα υπόλοιπα στοιχεία της βάσης που φτιάξαμε με γραφικό τρόπο, όπως φαίνεται στην Εικόνα 2.9.
Εικόνα 2.9
Εικόνα 2.10
ΠΡΟΣΟΧΗ! Το Management studio πρέπει να αναγνωρίζει σε ποια βάση δεδομένων θα εκτελέσει το κάθε ερώτημα. Γι αυτό, πρέπει, μετά τη δημιουργία της βάσης, είτε να δηλώσουμε στην αρχή του ερωτήματος ότι χρησιμοποιούμε/ εργαζόμαστε στην βάση δεδομένων DVDclub (με τη χρήση της δήλωσης «use DVDclub») είτε να δηλώνουμε κάθε φορά την πλήρη διαδρομή ονόματος του κάθε πίνακα (π.χ DVDclub.dbo.ΔΙΣΚΟΣ). Σημειώνεται ότι η δήλωση dbo είναι μία προκαθορισμένη συντόμευση του Management Studio για τον ιδιοκτήτη της βάσης δεδομένων (DataBase Owner), o οποίος έχει και τα πλήρη δικαιώματα διαχείρισης της υπό εξέτασης βάσης δεδομένων.
Πίνακας Περιεχομένων / Περιεχόμενα Κεφαλαίου
2.1.3. Διαγραφή μίας βάσης με κώδικα SQL
Στην περίπτωση που θέλουμε να διαγράψουμε μία βάση δεδομένων, μπορούμε να εκτελέσουμε το ερώτημα: drop database dvdclub ή να επιλέξουμε την αντίστοιχη εντολή από το menu, κάνοντας δεξί κλικ στο όνομα της βάσης δεδομένων.
Πίνακας Περιεχομένων / Περιεχόμενα Κεφαλαίου
2.2. Βασικές Έννοιες και Δημιουργία Πινάκων
Οι σχεσιακές βάσεις δεδομένων χρησιμοποιούν τις σχέσεις ή, αλλιώς, τους πίνακες για την αναπαράσταση των δεδομένων τους (Hoffer, Venkatarama, & Topi, 2013· Μανωλόπουλος, & Παπαδόπουλος, 2006). Ο κάθε πίνακας έχει ένα μοναδικό όνομα και προσδιορίζεται από ένα σύνολο γραμμών και στηλών. Κάθε γραμμή ενός πίνακα αναπαριστά μια εγγραφή (record) δεδομένων. Οι στήλες του πίνακα ορίζουν τα χαρακτηριστικά της κάθε εγγραφής. Για κάθε χαρακτηριστικό υπάρχει ένα σύνολο επιτρεπτών τιμών, το οποίο καλείται «πεδίο ορισμού του χαρακτηριστικού». Για τον πλήρη προσδιορισμό του πεδίου ορισμού ενός χαρακτηριστικού είναι απαραίτητο να γνωρίζουμε τον τύπο δεδομένων του (data type) και τη μορφοποίηση του. Οι βασικοί τύποι δεδομένων του SQL Server αναλύονται στη επόμενη υποενότητα.
Στον SQL Server κάθε στήλη ενός πίνακα σχετίζεται με ένα τύπο δεδομένων, ο οποίος αποτελεί ένα χαρακτηριστικό που προσδιορίζει το είδος των δεδομένων (integer, character, date κτλ.). Ο Πίνακας 2.1 παρέχει τις περιγραφές των βασικών κατηγοριών των τύπων δεδομένων που υποστηρίζει ο SQL Server και τις περιγραφές των βασικών τύπων δεδομένων που περιέχει κάθε κατηγορία:
Πίνακας 2.1
Πίνακας Περιεχομένων / Περιεχόμενα Κεφαλαίου
2.2.2.
Χρήσιμες συμβουλές για τους τύπους δεδομένων
Υπάρχουν πολλοί τύποι δεδομένων που παρουσιάζουν ελάχιστες διαφορές αλλά κάνουν την ίδια δουλειά. Ενδέχεται, σε πολύ εξειδικευμένο στάδιο, να προκαλέσουν προβλήματα ή ζητήματα απόδοσης. Δίνονται, λοιπόν, κάποιες χρήσιμες και πρακτικές συμβουλές που αφορούν τους τύπους δεδομένων:
Εικόνα 2.11
Εικόνα 2.12
Εικόνα 2.13
Πίνακας Περιεχομένων / Περιεχόμενα Κεφαλαίου
2.2.3. Δημιουργία πινάκων με τον Management Studio
Ο SQL Server υποστηρίζει την δημιουργία σχεσιακών βάσεων δεδομένων, των οποίων το κύριο δομικό συστατικό είναι η σχέση ή, αλλιώς, πίνακας. Μερικές από τις βασικότερες ιδιότητες των πινάκων είναι οι παρακάτω:
Ένα χαρακτηριστικό (ή ένα σύνολο χαρακτηριστικών) ενός πίνακα ονομάζεται πρωτεύον κλειδί (primary key) όταν ταυτοποιεί μοναδικά τις εγγραφές του. Όταν απαιτούνται περισσότερα χαρακτηριστικά ενός πίνακα για να συνθέσουν ένα πρωτεύον κλειδί, κάτι που συμβαίνει συχνά, τότε ονομάζεται σύνθετο (composite).
Τώρα, θα επιχειρήσουμε να δημιουργήσουμε το νέο πίνακα ΤΑΙΝΙΑ με τα ακόλουθα πεδία:
Field |
Type |
Null |
Key |
ID |
int |
|
PRI |
Τίτλος |
varchar(100) |
|
|
Έτος |
int |
YES |
|
Πίνακας 2.2 ΤΑΙΝΙΑ
Προκειμένου να δημιουργήσουμε αυτόν το νέο πίνακα στην βάση μας με γραφικό τρόπο, ανοίγουμε τη δενδρική δομή. Στο αριστερό pane του Management Studio επεκτείνουμε τη βάση δεδομένων DVDclub, όπως φαίνεται στην Εικόνα 2.14. Στη συνέχεια, επεκτείνοντας το φάκελο Tables, βλέπουμε τους πίνακες που δημιουργεί και αποθηκεύει ο SQL Server για κάθε νέα βάση. Κάνουμε δεξί κλικ στο δεξιό τμήμα και επιλέγουμε “New Table…”
Εικόνα 2.14
Ανοίγει ο Table Designer, όπως φαίνεται στην Εικόνα 2.15, ο οποίος μας επιτρέπει να σχεδιάσουμε το νέο πίνακα με γραφικό τρόπο. Συμπληρώνουμε τα στοιχεία του Πίνακα 2.2, όπως φαίνεται στην Εικόνα 2.15. Για την επιλογή ενός τύπου δεδομένων, είτε πληκτρολογούμε το όνομά του είτε διαλέγουμε κάποιον από την drop-down λίστα (δεύτερη στήλη). Στη συνέχεια, ορίζουμε το κύριο κλειδί κάνοντας δεξί κλικ στη γραμμή του πεδίου ID και επιλέγουμε “Set Primary Key”. Δίπλα στη γραμμή εμφανίζεται ένα εικονίδιο που αναπαριστά ένα κίτρινο κλειδί. Προσέχουμε σε κάθε πεδίο του πίνακα αν θα επιτρέπουμε NULL τιμές (π.χ. το τικ στην τελευταία στήλη της Εικόνας 2.15 δείχνει ότι το επιτρέπουμε).
Εικόνα 2.15
Παρατηρήστε τις ιδιότητες του υπό εξέταση κάθε φορά πεδίου του πίνακα ΤΑΙΝΙΑ. Για παράδειγμα, όπως φαίνεται στην Εικόνα 2.16, στον ορισμό του μήκους για το πεδίο Τίτλος είχαμε ορίσει μέγεθος 100 (η τιμή αυτή αφορά bytes). Τέλος, από τη γραμμή εργαλείων σώζουμε τον πίνακα κάνοντας κλικ στο εικονίδιο της δισκέτας. Δίνουμε το όνομα ΤΑΙΝΙΑ στον πίνακα και κλείνουμε το παράθυρο δημιουργίας πίνακα. Στη λίστα με τους πίνακες της βάσης DVDclub μπορούμε να δούμε πλέον τον πίνακα που δημιουργήσαμε.
Εικόνα 2.16
Μπορούμε να επαναλάβουμε το ίδιο για τη δημιουργία του πίνακα ΠΕΛΑΤΗΣ, με την ακόλουθη μορφή:
Field |
Type |
Null |
Key |
ID |
Int |
|
PRI |
Όνομα |
Varchar(30) |
|
|
Τηλέφωνο |
Varchar(10) |
YES |
|
Πίνακας Περιεχομένων / Περιεχόμενα Κεφαλαίου
2.2.4. Δημιουργία πινάκων με κώδικα της SQL
Εναλλακτικά, χρησιμοποιώντας τον κώδικα της SQL, θα δημιουργήσουμε τον πίνακα ΣΥΝΤΕΛΕΣΤΗΣ με την ακόλoυθη μορφή:
Field |
Type |
Null |
Key |
ID |
Int |
|
PRI |
Όνομα |
Varchar(50) |
|
|
Ανοίγουμε τον Query Editor και προσέχουμε η ενεργή/ επιλεγμένη βάση να είναι η DVDclub. Συνεπώς, μπορούμε να πληκτρολογήσουμε τον παρακάτω κώδικα για να δημιουργήσουμε τον πίνακα ΣΥΝΤΕΛΕΣΤΗΣ με τους δύο ακόλουθους εναλλακτικούς τρόπους:
1ος τρόπος:
CREATE TABLE ΣΥΝΤΕΛΕΣΤΗΣ
(
ID int NOT NULL,
Όνομα varchar(50) NOT NULL,
PRIMARY KEY (ID)
)
2ος τρόπος:
CREATE TABLE ΣΥΝΤΕΛΕΣΤΗΣ
(
ID int PRIMARY KEY
Όνομα varchar (50) NOT NULL
)
Σχετικά με τον πρώτο τρόπο σύνταξης, θα πρέπει να τονίσουμε ότι το NOT NULL στο χαρακτηριστικό ID είναι προαιρετικό, γιατί δηλώνεται, στη συνέχεια, ως πρωτεύον κλειδί και δεν θα είναι ποτέ NULL. Για να εκτελέσουμε τον παραπάνω κώδικα, πατάμε είτε στην εργαλειοθήκη το κουμπί Execute είτε στο πληκτρολόγιο το F5, προσέχοντας ότι έχουμε επιλέξει τη βάση DVDclub και όχι τη master. Κάνοντας δεξί κλικ πάνω από τον φάκελο Tables και στη συνέχεια επιλέγοντας Refresh, βλέπουμε τους τρεις πίνακες που έχουμε ήδη δημιουργήσει. Αν θέλουμε να αλλάξουμε οτιδήποτε στη σχεδίαση ενός πίνακα, τον επιλέγουμε με δεξί κλικ και κάνουμε κλικ στην επιλογή Design, όπως φαίνεται στην Εικόνα 2.17.
Εικόνα 2.17
Στη συνέχεια, θα δημιουργήσουμε τον πίνακα ΔΙΣΚΟΣ. Τονίζεται ότι για πρώτη φορά θα ορίσουμε και μια συσχέτιση μεταξύ δύο πινάκων. Η συσχέτιση αφορά τον πίνακα ΔΙΣΚΟΣ με τον πίνακα ΤΑΙΝΙΑ. Όπως αναφέραμε και στο μοντέλο Οντοτήτων-Συσχετίσεων, μπορούν να υπάρχουν πολλά αντίγραφα ενός δίσκου dvd για την ίδια ταινία. Συνεπώς, το πρωτευόν κλειδί (ID) του πίνακα ΤΑΙΝΙΑ θα πρέπει να μπορεί να εμφανίζεται πολλές φορές ως χαρακτηριστικό (IDΤαινίας) του πίνακα ΔΙΣΚΟΣ. Στη περίπτωση αυτή, το πρωτεύον κλειδί του πίνακα ΤΑΙΝΙΑ αποτελεί ξένο κλειδί (foreign key) για τον πίνακα ΔΙΣΚΟΣ.
Ο πίνακας ΔΙΣΚΟΣ έχει την ακόλουθη μορφή:
Field |
Type |
Null |
Key |
ID |
Int |
|
PRI |
IDΤαινίας |
Int |
|
|
Τύπος |
Varchar(4) |
|
|
Τιμή |
decimal (9,2) |
|
|
Επιστρέφουμε στον Query Editor. Προσέχουμε η επιλεγμένη βάση να είναι η DVDclub. Σβήνουμε από τον editor όλα τα περιεχόμενα. Για να δημιουργήσουμε τον πίνακα ΔΙΣΚΟΣ επιλέγουμε έναν από τους δύο τρόπους που παρουσιάζουμε παρακάτω:
1ος τρόπος:
CREATE TABLE ΔΙΣΚΟΣ
(
ID int,
IDΤαινίας int NOT NULL,
Τύπος varchar(4) NOT NULL,
Τιμή decimal(9,2) NOT NULL,
PRIMARY KEY (ID),
FOREIGN KEY (IDΤαινίας) REFERENCES ΤΑΙΝΙΑ(ID) on delete cascade
)2ος τρόπος:
CREATE TABLE ΔΙΣΚΟΣ
(
ID int PRIMARY KEY,
IDΤαινίας int REFERENCES ΤΑΙΝΙΑ(ID) ON DELETE CASCADE,
Τύπος varchar(4) NOT NULL,
Τιμή decimal(9,2) NOT NULL
)
Ο περιορισμός ξένου κλειδιού (FOREIGN KEY constraint) ορίζει μια συσχέτιση μεταξύ δύο πινάκων (Μανωλόπουλος, & Παπαδόπουλος, 2006· Ramakrishnan, & Gehrke, 2003). Το κύριο κλειδί ενός πίνακα γίνεται ξένο κλειδί σε έναν άλλο πίνακα. Συνεπώς, δημιουργείται μία συσχέτιση ένα προς πολλά. Ο περιορισμός ξένου κλειδιού αποτρέπει ενέργειες που αφήνουν «ορφανές» εγγραφές σε ένα ξένο κλειδί/ πεδίο ενός πίνακα όταν αυτό το πεδίο αναφέρεται σε ένα κύριο κλειδί ενός άλλου πίνακα (Αναφορική Ακεραιότητα).
Στον πίνακα ΔΙΣΚΟΣ ορίζουμε ότι το πεδίο IDΤαινίας αναφέρεται (είναι ξένο κλειδί) στο πεδίο ID του πίνακα ΤΑΙΝΙΑ. Με αυτόν τον τρόπο δεν θα μπορεί να υπάρξει μια συγκεκριμένη τιμή στο πεδίο IDΤαινίας του πίνακα ΔΙΣΚΟΣ, αν αυτή η τιμή δεν έχει καταχωρηθεί προηγουμένως στο πεδίο ID του πίνακα ΤΑΙΝΙΑ.
Η χρήση του ON DELETE ελέγχει την περίπτωση διαγραφής μιας εγγραφής του πίνακα ΤΑΙΝΙΑ. Υπάρχουν οι εξής επιλογές:
- NO ACTION: αποτρέπεται η διαγραφή και προβάλλεται μήνυμα λάθους.
- CASCADE: διαγράφει την εγγραφή και προκαλεί διαγραφή όλων των εγγραφών με την ίδια τιμή στον πίνακα ΔΙΣΚΟΣ.
- Set Null: διαγράφει την εγγραφή και στις εξαρτώμενες εγγραφές θα εισάγει την τιμή Null.
- Set Default: διαγράφει την εγγραφή και στις εξαρτώμενες εγγραφές θα εισάγει την default τιμή που ορίσουμε κατά την δημιουργία του πεδίου.
Σημειώνεται ότι αντίστοιχοι περιορισμοί μπορούν να ορισθούν, μέσω του όρου ON UPDATE, και για την περίπτωση μεταβολής του κύριου κλειδιού.
Πίνακας Περιεχομένων / Περιεχόμενα Κεφαλαίου
2.2.5. Συσχετίσεις/Relationships Πινάκων
Στην Ενότητα 2.2.4 ο πίνακας ΔΙΣΚΟΣ συσχετίστηκε με τον πίνακα ΤΑΙΝΙA μέσω του πεδίου IDΤαινίας. Αν δεν είχαμε κάνει τη συσχέτιση των δύο πινάκων (της προηγούμενης ενότητας) αλλά είχαμε δημιουργήσει μόνο τους πίνακες, τότε, προκειμένου να δημιουργήσουμε την ίδια συσχέτιση με γραφικό τρόπο, πρέπει να επεκτείνουμε το φάκελο Tables, να κάνουμε δεξί κλικ πάνω στον πίνακα ΔΙΣΚΟΣ και, τέλος, κλικ στην επιλογή Design. Αφού ανοίξει ο Table Designer, με δεξί κλικ οπουδήποτε πάνω στην σχεδίαση επιλέγουμε Relationships, όπως φαίνεται στην Εικόνα 2.18.
Εικόνα 2.18
Στη συνέχεια εμφανίζεται το αρχικό παράθυρο της Εικόνας 2.19. Πατώντας στο κουμπί ΑDD μπορούμε να δημιουργήσουμε τη συσχέτιση με γραφικό τρόπο. Αρχικά μετονομάζουμε τη συσχέτιση σε FK_ ΔΙΣΚΟΣ_TAINIA. Στη συνέχεια κάνουμε κλικ στην επιλογή Tables and Columns Specification. Εμφανίζεται το αναδυόμενο παράθυρο της Εικόνας 2.19, στο οποίο δηλώνουμε τον κύριο πίνακα με το κύριο κλειδί του (ΤΑΙΝΙΑ.ID), καθώς και τον εξαρτώμενο πίνακα με το ξένο κλειδί (ΔΙΣΚΟΣ.IDΤαινίας).
Εικόνα 2.19
Μ’ αυτόν τον τρόπο, στον πίνακα ΔΙΣΚΟΣ ορίζουμε το πεδίο IDΤαινίας να είναι ξένο κλειδί του πεδίου ID στον πίνακα ΤΑΙΝΙΑ. Έτσι, δεν θα μπορεί να εισαχθεί μια τιμή στο πεδίο IDΤαινίας του πίνακα ΔΙΣΚΟΣ, αν αυτή προηγουμένως δεν έχει εισαχθεί στο πεδίο ID του πίνακα ΤΑΙΝΙΑ.
Τέλος, όπως φαίνεται στην Εικόνα 2.20, μπορούμε και με γραφικό τρόπο να κάνουμε χρήση του DELETE Rule, με επιλογές παρόμοιες με αυτές που αναφέρθηκαν στην Ενότητα 2.2.4 (π.χ. No Action, Cascade, Set Null, Set Default). Αντίστοιχα, η χρήση της ρύθμισης Update Rule αφορά την περίπτωση που γίνεται update στο κύριο κλειδί του κύριου πίνακα.
Εικόνα 2.20
Πίνακας Περιεχομένων / Περιεχόμενα Κεφαλαίου
2.2.6. Δημιουργία πινάκων με τον Database Diagrams
Κάνοντας δεξί κλικ πάνω στον φάκελο Database Diagrams, όπως φαίνεται στην Εικόνα 2.21, δημιουργούμε ένα νέο διάγραμμα, στο οποίο μπορούμε με οπτικό τρόπο να ορίσουμε τη δομή και τις συσχετίσεις των πινάκων της βάσης δεδομένων μας.
Εικόνα 2.21
Στο παράθυρο που εμφανίζει όλους τους διαθέσιμους πίνακες, όπως φαίνεται στην Εικόνα 2.22, επιλέγουμε αυτούς που θέλουμε να εμφανιστούν και τους εισάγουμε με add στο χώρο του διαγράμματός μας.
Εικόνα 2.22
Με τη χρήση του ποντικιού μπορούμε εύκολα να αλλάξουμε το μέγεθος και τη διάταξη των πινάκων, όπως φαίνεται στην Εικόνα 2.23.
Εικόνα 2.23
Με δεξί κλικ πάνω σε κάθε γραμμή συσχέτισης μπορούμε να χειριστούμε τις ιδιότητες μίας συσχέτισης. Επίσης με δεξί κλικ πάνω σε πίνακα μπορούμε να χειριστούμε το τι βλέπουμε στο διάγραμμα καθώς και όλες τις αλλαγές που μπορούμε να επιβάλλουμε στην σχεδίαση του, όπως φαίνεται στην Εικόνα 2.24.
Εικόνα 2.24
Μπορούμε τώρα να προχωρήσουμε στη δημιουργία του πίνακα ΕΝΟΙΚΙΑΣΗ, ο οποίος θα έχει την ακόλουθη μορφή:
Field |
Type |
Null |
Key |
IDΠελάτη |
int |
|
PRI |
IDΔίσκου |
int |
|
PRI |
Από |
date |
|
|
Έως |
date |
YES |
|
Στον πίνακα ΕΝΟΙΚΙΑΣΗ το κύριο κλειδί αποτελείται από περισσότερα του ενός πεδία (IDΠελάτη, IDΔίσκου). Σε αυτήν την περίπτωση, επιτρέπεται να υπάρχουν διπλές τιμές στο ίδιο πεδίο. Όμως, κάθε συνδυασμός των τιμών των δύο πεδίων που αποτελούν το κύριο κλειδί πρέπει να είναι μοναδικός. Μ’ αυτόν τον τρόπο, ο σχεδιασμός δεν επιτρέπει ο ίδιος πελάτης να ενοικιάσει δεύτερη φορά μια ταινία. Πρέπει να επισημάνουμε ότι η στήλη IDΠελάτη είναι ξένο κλειδί προς τη στήλη ID του πίνακα ΠΕΛΑΤΗΣ, ενώ η στήλη IDΔίσκου είναι ξένο κλειδί προς τη στήλη ID του πίνακα ΔΙΣΚΟΣ.
Προκειμένου να φτιάξουμε τον πίνακα ΕΝΟΙΚΙΑΣΗ μέσα από το περιβάλλον του Database Diagrams, είτε κάνουμε κλικ στο κουμπί New Table στην γραμμή εργαλείων είτε κάνουμε δεξί κλικ στο διάγραμμα και επιλέγουμε New Table. Στο παράθυρο διαλόγου Choose Name επιλέγουμε το όνομα ΕΝΟΙΚΙΑΣΗ και πατάμε ΟΚ. Στο αναδυόμενο παράθυρο (που μοιάζει με αυτό του Table Designer) προσθέτουμε τα στοιχεία για τα πεδία και ορίζουμε το κύριο κλειδί. Η επιλογή των δύο πεδίων γίνεται κρατώντας πατημένο το πλήκτρο Ctrl και ταυτόχρονα κάνοντας δεξί κλικ πάνω τους και κλικ στο Set Primary Key. Τότε, τα δύο πεδία εμφανίζονται με σκίαση, όπως φαίνεται στην Εικόνα 2.25:
Εικόνα 2.25
Για να συσχετίσουμε τον πίνακα ΠΕΛΑΤΗΣ με τον πίνακα ΕΝΟΙΚΙΑΣΗ, επιλέγουμε το πεδίο ID του πίνακα ΠΕΛΑΤΗΣ (κρατώντας πατημένο το ποντίκι στο εικονίδιο με το κίτρινο κλειδί) και το μεταφέρουμε (με drag & drop) πάνω από το πεδίο IDΠελάτη του πίνακα ΕΝΟΙΚΙΑΣΗ. Εμφανίζεται, έτσι, το παράθυρο της Εικόνας 2.26, με τα πεδία που συμμετέχουν στη συσχέτιση να είναι προεπιλεγμένα.
Εικόνα 2.26
Επιλέγουμε ΟΚ και, στη συνέχεια, επεκτείνουμε την επιλογή Insert and Update Specification. Επιλέγουμε Cascade, το οποίο αφορά στο τι θα γίνει σε περίπτωση αλλαγής (update) της τιμής κύριου κλειδιού, όπως φαίνεται στην Εικόνα 2.27.
Εικόνα 2.27
Κατά τον ίδιο τρόπο συσχετίζουμε τον πίνακα ΔΙΣΚΟΣ με τον πίνακα ΕΝΟΙΚΙΑΣΗ με βάση τα πεδία (ΔΙΣΚΟΣ.Id) και (ΕΝΟΙΚΙΑΣΗ.IDΔίσκου). Η τρέχουσα κατάσταση του Database Diagram φαίνεται στην Εικόνα 2.28.
Εικόνα 2.28
Στη συνέχεια θα δημιουργήσουμε τον πίνακα ΡΟΛΟΣ, όπου θα καταγράφονται οι διαφορετικοί τύποι συμμετοχής ενός συντελεστή σε μια ταινία (π.χ. ηθοποιός, σκηνοθέτης, ηχολήπτης, κτλ.). Προκειμένου να δημιουργήσουμε τον πίνακα ΡΟΛΟΣ (έτσι όπως φαίνεται στον Πίνακα 2.8), κάνουμε δεξί κλικ μέσα στο Database Diagram, επιλέγουμε New Table και δίνουμε το όνομα ΡΟΛΟΣ. Στην φόρμα που θα εμφανιστεί συμπληρώνουμε τα στοιχεία του Πίνακα 2.8. Για την επιλογή ενός τύπου δεδομένων, είτε πληκτρολογούμε το όνομά του είτε διαλέγουμε κάποιον από την drop-down λίστα της δεύτερης στήλης. Στη συνέχεια, ορίζουμε το κύριο κλειδί κάνοντας δεξί κλικ στη γραμμή του πεδίου ID και επιλέγουμε “Set Primary Key”. Επίσης, σε κάθε πεδίο του πίνακα προσέχουμε αν θα επιτρέπουμε NULL τιμές.
Field |
Type |
Null |
Key |
ID |
Int |
|
PRI |
Περιγραφή |
Varchar(25) |
|
|
Τέλος, θα δημιουργήσουμε τον πίνακα Τ_Σ_Ρ, που συσχετίζει τον πίνακα ΤΑΙΝΙΑ, με τον πίνακα ΣΥΝΤΕΛΕΣΤΗΣ και τον πίνακα ΡΟΛΟΣ, έχοντας ένα τριπλό σύνθετο κύριο κλειδί, όπως φαίνεται στον Πίνακα 2.9. Σημειώνεται ότι η στήλη IDΤαινίας είναι ξένο κλειδί προς τη στήλη ID του πίνακα ΤΑΙΝΙΑ, η στήλη IDΣυντελεστή είναι ξένο κλειδί προς τη στήλη ID του πίνακα ΣΥΝΤΕΛΕΣΤΗΣ και η στήλη IDΡόλου είναι ξένο κλειδί προς την στήλη ID του πίνακα ΡΟΛΟΣ.
Field |
Type |
Null |
Key |
IDΤαινίας |
Int |
|
PRI |
IDΣυντελεστή |
Int |
|
PRI |
IDΡόλου |
Int |
|
PRI |
Πίνακας 2.9 Τ_Σ_Ρ
Μέσω τις παραπάνω τριαδικής συσχέτισης του πίνακα Τ_Σ_Ρ, ο ίδιος συντελεστής θα μπορεί να συμμετέχει σε μία ταινία με περισσότερους από ένα ρόλους (π.χ. ηθοποιός και σκηνοθέτης ταυτόχρονα στην ίδια ταινία). Αυτό υλοποιείται με τη σύνδεση του πίνακα Τ_Σ_Ρ με τους πίνακες ΣΥΝΤΕΛΕΣΤΗΣ, ΡΟΛΟΣ και ΤΑΙΝΙΑ.
Μετά από τις τελευταίες δύο προσθήκες πινάκων (Τ_Σ_Ρ και ΡΟΛΟΣ) το τελικό σχήμα της βάσης δεδομένων μας είναι αυτό που φαίνεται στην Εικόνα 2.2, η οποία παρουσιάζεται ξανά αμέσως μετά (όπως φαίνεται στην Εικόνα 2.29) για λόγους εύκολης και άμεσης αναγνωσιμότητας.
Εικόνα 2.29
Μετά τη δημιουργία πινάκων, ο χρήστης είναι σε θέση να εφαρμόσει οποιαδήποτε αλλαγή επιθυμεί στους πίνακες της βάσης δεδομένων που θα επιλέξει. Στη συνέχεια, παρουσιάζουμε τη σύνταξη του αντίστοιχου ερωτήματος με ένα παράδειγμα εφαρμογής αλλαγών στον πίνακα ΠΕΛΑΤΗΣ.
ALTER TABLE ΠΕΛΑΤΗΣ
ADD COLUMN Ημερομηνία_Γέννησης DATE NOT NULL
Σε αυτό το παράδειγμα, εφαρμόζουμε αλλαγές στον πίνακα ΠΕΛΑΤΗΣ προσθέτοντας τη στήλη Ημερομηνία_Γέννησης και στη συνέχεια, διαγράφουμε τη στήλη.
Επίσης, μπορούμε να διαγράψουμε πίνακες από τη βάση δεδομένων που έχουμε δημιουργήσει με τη σύνταξη του παρακάτω ερωτήματος, με το οποίο διαγράφουμε τον πίνακα ΕΝΟΙΚΙΑΣΗ:
Η επιλογή restrict δηλώνει ότι στην περίπτωση που ο πίνακας χρησιμοποιείται σε περιορισμούς στους ορισμούς άλλων πινάκων, δε θα διαγραφεί. Αντίθετα, με τον ορισμό cascade ο πίνακας που έχουμε δηλώσει διαγράφεται και, μαζί με αυτόν, διαγράφονται και οι περιορισμοί που τον χρησιμοποιούν.
Πίνακας Περιεχομένων / Περιεχόμενα Κεφαλαίου
2.3. Εισαγωγή τιμών στους πίνακες
2.3.1. Εισαγωγή τιμών στους πίνακες με το Management Studio
Θα επιχειρήσουμε τώρα να εισάγουμε τις ακόλουθες εγγραφές στον πίνακα ΤΑΙΝΙΑ:
IDΤαινίας |
Τίτλος |
Χρονιά |
1 |
Rear Window |
1954 |
2 |
Psycho |
1960 |
3 |
Ben-Hur |
1959 |
Πίνακας 2.8 ΤΑΙΝΙΑ
Είμαστε στην κονσόλα του Management Studio και βλέπουμε τους πίνακες της βάσης DVDclub. Κάνουμε δεξί κλικ στον πίνακα ΤΑΙΝΙΑ. Επιλέγουμε Edit Top 200 Rows, όπως φαίνεται στην Εικόνα 2.30.
Εικόνα 2.30
Εισάγουμε τα δεδομένα με τον ίδιο τρόπο που εισάγουμε τιμές σε ένα φύλλο του Excel, όπως φαίνεται στην Εικόνα 2.31. Κάθε φορά που καταχωρούμε μία εγγραφή, ο δείκτης πηγαίνει στην επόμενη γραμμή, κάτι που σημαίνει ότι η εγγραφή μας έχει αποθηκευτεί.
Εικόνα 2.31
Επαναλαμβάνουμε τα προηγούμενα βήματα για να εισάγουμε τις ακόλουθες τιμές
στον πίνακα ΣΥΝΤΕΛΕΣΤΗΣ:
ID |
Όνομα |
1 |
Alfred Hitchcock |
2 |
Grace Kelly |
3 |
Anthony Perkins |
Πίνακας 2.9 ΣΥΝΤΕΛΕΣΤΗΣ
Επίσης, για τον πίνακα ΡΟΛΟΣ εισάγουμε τις ακόλουθες τιμές:
ID |
Περιγραφή |
1 |
Σκηνοθέτης |
2 |
Ηθοποιός |
Επαναλαμβάνουμε τα προηγούμενα βήματα για να εισάγουμε τις ακόλουθες τιμές
στον πίνακα ΠΕΛΑΤΗΣ:
ID |
Όνομα |
Τηλέφωνο |
1 |
Perkins |
246801 |
2 |
Καντακουζηνός |
246801 |
3 |
Παλαιολόγος |
987654 |
Τέλος, επαναλαμβάνουμε τα προηγούμενα βήματα για να εισάγουμε τις
ακόλουθες τιμές στον πίνακα Τ_Σ_Ρ:
IDΤαινίας |
IDΣυντελεστή |
IDΡόλου |
1 |
1 |
1 |
2 |
1 |
2 |
1 |
2 |
1 |
2 |
3 |
2 |
Πίνακας Περιεχομένων / Περιεχόμενα Κεφαλαίου
2.3.2.
Εισαγωγή τιμών στους πίνακες με εντολές SQL
Η δήλωση INSERT, χρησιμοποιείται για να προσθέσει μια νέα γραμμή (ή γραμμές) σε έναν πίνακα. Θα εισάγουμε τις ακόλουθες τιμές στον πίνακα ΔΙΣΚΟΣ:
ID |
IDΤαινίας |
Τύπος |
Τιμή |
1 |
1 |
BLU-RAY |
2 |
2 |
1 |
DVD |
3 |
3 |
2 |
BLU-RAY |
2 |
Μεταβαίνουμε στο Management Studio και επιλέγουμε από την μπάρα εργαλείων New Query. Η ίδια επιλογή μπορεί να γίνει με δεξί κλικ στην database DVDclub και κλικ στο New Query, όπως φαίνεται στην Εικόνα 2.32.
Εικόνα 2.32
Δίνουμε την παρακάτω εντολή, η οποία φαίνεται και στην Εικόνα 2.33:
INSERT INTO ΔΙΣΚΟΣ
(ID, IDΤαινίας, Τύπος, Τιμή)
VALUES (4, 1, 'BLU-RAY', 2)
GO
Εικόνα 2.33
Επιλέγουμε EXECUTE/F5 για εκτέλεση. Η εγγραφή θα εισαχθεί (εκτός απροόποτου) στο παράθυρο Messages, οπότε θα δούμε το μήνυμα (1 row(s) affected), όπως φαίνεται στην Εικόνα 2.33.
Η χρήση των ονομάτων των στηλών είναι προαιρετική. Πρέπει, όμως, να βάλουμε όλα τα ορίσματα με τη σωστή σειρά. Για παράδειγμα, η δεύτερη εγγραφή μπορεί να εισαχθεί ως εξής:
INSERT INTO ΔΙΣΚΟΣ
VALUES (2, 1, 'DVD', 3)
GO
Επίσης, μπορούμε να αλλάξουμε τη σειρά με την οποία δηλώνουμε τα ορίσματα. Για παράδειγμα:
INSERT INTO ΔΙΣΚΟΣ
(ID, IDΤαινίας, Τιμή, Τύπος)
VALUES (3, 2, 2, 'BLU-RAY')
GO
Για να ελέγξουμε αν εισήχθησαν σωστά οι εγγραφές στον πίνακα ΔΙΣΚΟΣ, κάνουμε δεξί κλικ στον πίνακα και επιλέγουμε την εντολή «Select Top 1000 Rows», όπως φαίνεται στην Εικόνα 2.34.
Εικόνα 2.34
Στην Εικόνα 2.35 βλέπουμε τις τιμές των πεδίων του πίνακα ΔΙΣΚΟΣ, καθώς
και το ερώτημα SQL , το οποίο συντάσσετε αυτόματα από το Management Studio.
Εικόνα 2.35
Επαναλαμβάνουμε τα προηγούμενα βήματα για την εισαγωγή των ακόλουθων εγγραφών στον πίνακα ΕΝΟΙΚΙΑΣΗ, προσέχοντας ιδιαίτερα να γράφουμε πρώτα το μήνα και μετά την ημέρα:
IDΠελάτη |
IDΔίσκου |
Από |
Εώς |
1 |
1 |
07/10/2006 |
09/10/2006 |
1 |
2 |
09/20/2006 |
11/20/2006 |
2 |
1 |
09/10/2006 |
Null |
INSERT INTO ΕΝΟΙΚΙΑΣΗ
(IDΠελάτη, IDΔίσκου, Από, Έως)
VALUES (1, 1, '07/10/2006', '09/10/2006')
GOINSERT INTO ΕΝΟΙΚΙΑΣΗ
(IDΠελάτη, IDΔίσκου, Από, Έως)
VALUES (1, 2, '09/20/2006', '11/20/2006')
GO
Αν παραλείψουμε ένα όρισμα, τότε στο αντίστοιχο πεδίο εισάγεται η τιμή NULL, εφόσον, βέβαια, δεν υπάρχει περιορισμός NOT NULL για αυτό το πεδίο. Για παράδειγμα:
INSERT INTO ΕΝΟΙΚΙΑΣΗ
(IDΠελάτη, IDΔίσκου, Από)
VALUES (2, 1, '09/10/2006')
GO
Αν δοκιμάσουμε να εκτελέσουμε μαζί τις εντολές και όχι ξεχωριστά, τότε το αποτέλεσμα θα φαίνεται όπως αυτό της Εικόνας 2.36:
Εικόνα 2.36
Τέλος, προκειμένου να εισάγουμε την τέταρτη εγγραφή του πίνακα 2.13, πρέπει να εκτελέσουμε την παρακάτω εντολή:
INSERT INTO ΕΝΟΙΚΙΑΣΗ
(IDΠελάτη, IDΔίσκου, Από, Έως)
VALUES (2, 2, '09/30/2006', '9/30/2006')
GO
Πίνακας Περιεχομένων / Περιεχόμενα Κεφαλαίου
2.4. Αλλαγή σε δεδομένα πινάκων
Τα δεδομένα στους πίνακες μπορούν να αλλάζουν ή να διαγράφονται. Παραθέτουμε εδώ τις δύο βασικές εντολές. Το συγκεκριμένο θέμα θα εξεταστεί πιο αναλυτικά στο Κεφάλαιο 4.
Στην περίπτωση όπου απαιτείται η αλλαγή των τιμών των στηλών ενός πίνακα, χρησιμοποιούμε την εντολή UPDATE, η σύνταξη της οποίας περιγράφεται στη συνέχεια:
Η ενημέρωση των δεδομένων αποτυγχάνει στην περίπτωση που μετά από έλεγχο δεν ικανοποιούνται οι περιορισμοί ακεραιότητας. Επίσης, θα πρέπει να δοθεί προσοχή στον τρόπο που θα ορίσουμε τη συνθήκη WHERE, ώστε να προσδιορίσουμε αν θα ενημερωθούν τα δεδομένα σε μία μόνο εγγραφή του πίνακα, προσθέτοντας στη συνθήκη κάποιο κλειδί του πίνακα. Στην περίπτωση που το κλειδί παραλειφθεί, υπάρχει κίνδυνος να αλλοιωθούν τα δεδομένα του πίνακα. Ας υποθέσουμε, λοιπόν, ότι μας ζητείται να αλλάξουμε την ημερομηνία έναρξης ενοικίασης από 09/30/2006 σε 09/29/2006 στην εγγραφή του πίνακα ΕΝΟΙΚΙΑΣΗ που αφορά τον οπτικό δίσκο με κωδικό (IDΔίσκου = 2), ο οποίος ενοικιάστηκε από τον πελάτη με κωδικό (IDΠελάτη=2). Η σύνταξη της εντολής DELETE είναι:
Εκτός από την ανανέωση των δεδομένων ενός πίνακα, μπορούμε να διαγράψουμε δεδομένα μέσα σε πίνακες. Με την εντολή διαγραφής DELETE μπορούμε να καταργήσουμε τις γραμμές που επιθυμούμε από επιλεγμένους πίνακες. Η σύνταξη της εντολής DELETE είναι:
Σ’αυτήν την περίπτωση, γίνεται έλεγχος των περιορισμών ακεραιότητας για την επιτυχή εκτέλεση της διαγραφής. Ας υποθέσουμε, λοιπόν, ότι μας ζητείται να διαγράψουμε την εγγραφή του πίνακα ΕΝΟΙΚΙΑΣΗ που αφορά τον οπτικό δίσκο με κωδικό (IDΔίσκου = 2), ο οποίος ενοικιάστηκε από τον πελάτη με κωδικό (IDΠελάτη=2). Η αντίστοιχη εντολή σε SQL είναι:
DELETE FROM ΕΝΟΙΚΙΑΣΗ
WHERE IDΔίσκου = 2 and IDΠελάτη = 2
Πίνακας Περιεχομένων / Περιεχόμενα Κεφαλαίου
2.5. Κώδικας SQL για τη δημιουργία της βάσης δεδομένων DVDclub
Παρακάτω δίνεται ολόκληρος ο κώδικας SQL για τη δημιουργία της βάσης δεδομένων DVDclub, προκειμένου να αποφευχθούν πιθανά προβλήματα λόγω λαθών από την τμηματική εκτέλεση των ερωτημάτων, όπως αυτά αναπτύχθηκαν στις προηγούμενες ενοτήτες. Η πρότασή μας προς τον χρήστη είναι να διαγράψει τη βάση δεδομένων DVDclub από το σύστημα και να την δημιουργήσει ξανά. Στη συνέχεια, επιλέγοντας ως ενεργή βάση δεδομένων τη DVDclub (όχι τη master) και ανοίγοντας τον Query Editor, να τρέξει τον παρακάτω κώδικα SQL:
USE [DVDclub]
GO
/****** Object: Table [dbo].[ΔΙΣΚΟΣ] Script Date: 11/7/2015 5:23:16 μμ ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[ΔΙΣΚΟΣ](
[Id] [int] NOT NULL,
[IDΤαινίας] [int] NOT NULL,
[Τύπος] [varchar](7) NOT NULL,
[Τιμή] [decimal](9, 2) NOT NULL,
CONSTRAINT [PK_ΔΙΣΚΟΣ] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[ΕΝΟΙΚΙΑΣΗ] Script Date: 11/7/2015 5:23:16 μμ ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ΕΝΟΙΚΙΑΣΗ](
[IDΠελάτη] [int] NOT NULL,
[IDΔίσκου] [int] NOT NULL,
[Από] [date] NOT NULL,
[Έως] [date] NULL,
CONSTRAINT [PK_ΕΝΟΙΚΙΑΣΗ] PRIMARY KEY CLUSTERED
(
[IDΠελάτη] ASC,
[IDΔίσκου] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[ΠΕΛΑΤΗΣ] Script Date: 11/7/2015 5:23:16 μμ ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[ΠΕΛΑΤΗΣ](
[Id] [int] NOT NULL,
[Όνομα] [varchar](30) NOT NULL,
[Τηλέφωνο] [varchar](10) NULL,
CONSTRAINT [PK_ΠΕΛΑΤΗΣ] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[ΡΟΛΟΣ] Script Date: 11/7/2015 5:23:16 μμ ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[ΡΟΛΟΣ](
[Id] [int] NOT NULL,
[Περιγραφή] [varchar](25) NOT NULL,
CONSTRAINT [PK_ΡΟΛΟΣ] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[ΣΥΝΤΕΛΕΣΤΗΣ] Script Date: 11/7/2015 5:23:16 μμ ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[ΣΥΝΤΕΛΕΣΤΗΣ](
[Id] [int] NOT NULL,
[Όνομα] [varchar](50) NULL,
CONSTRAINT [PK_ΣΥΝΤΕΛΕΣΤΗΣ] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[Τ_Σ_Ρ] Script Date: 11/7/2015 5:23:16 μμ ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Τ_Σ_Ρ](
[IDΤαινίας] [int] NOT NULL,
[IDΣυντελεστή] [int] NOT NULL,
[IDΡόλου] [int] NOT NULL,
CONSTRAINT [PK_ΤΣ2] PRIMARY KEY CLUSTERED
(
[IDΤαινίας] ASC,
[IDΣυντελεστή] ASC,
[IDΡόλου] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[ΤΑΙΝΙΑ] Script Date: 11/7/2015 5:23:16 μμ ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[ΤΑΙΝΙΑ](
[Id] [int] NOT NULL,
[Τίτλος] [varchar](100) NOT NULL,
[Έτος] [int] NULL,
CONSTRAINT [PK_ΤΑΙΝΙΑ] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[ΔΙΣΚΟΣ] ([Id], [IDΤαινίας], [Τύπος], [Τιμή]) VALUES (1, 1, N'BLU-RAY', CAST(2.00 AS Decimal(9, 2)))
GO
INSERT [dbo].[ΔΙΣΚΟΣ] ([Id], [IDΤαινίας], [Τύπος], [Τιμή]) VALUES (2, 1, N'DVD ', CAST(3.00 AS Decimal(9, 2)))
GO
INSERT [dbo].[ΔΙΣΚΟΣ] ([Id], [IDΤαινίας], [Τύπος], [Τιμή]) VALUES (3, 2, N'BLU-RAY', CAST(2.00 AS Decimal(9, 2)))
GO
INSERT [dbo].[ΕΝΟΙΚΙΑΣΗ] ([IDΠελάτη], [IDΔίσκου], [Από], [Έως]) VALUES (1, 1, CAST(N'2006-07-10' AS Date), CAST(N'2006-09-10' AS Date))
GO
INSERT [dbo].[ΕΝΟΙΚΙΑΣΗ] ([IDΠελάτη], [IDΔίσκου], [Από], [Έως]) VALUES (1, 2, CAST(N'2006-09-20' AS Date), CAST(N'2006-11-20' AS Date))
GO
INSERT [dbo].[ΕΝΟΙΚΙΑΣΗ] ([IDΠελάτη], [IDΔίσκου], [Από], [Έως]) VALUES (2, 1, CAST(N'2006-09-10' AS Date), NULL)
GO
INSERT [dbo].[ΠΕΛΑΤΗΣ] ([Id], [Όνομα], [Τηλέφωνο]) VALUES (1, N'Perkins', N'246801')
GO
INSERT [dbo].[ΠΕΛΑΤΗΣ] ([Id], [Όνομα], [Τηλέφωνο]) VALUES (2, N'Καντακουζηνός', N'246801')
GO
INSERT [dbo].[ΠΕΛΑΤΗΣ] ([Id], [Όνομα], [Τηλέφωνο]) VALUES (3, N'Παλαιολόγος', N'987654')
GO
INSERT [dbo].[ΡΟΛΟΣ] ([Id], [Περιγραφή]) VALUES (1, N'Σκηνοθέτης')
GO
INSERT [dbo].[ΡΟΛΟΣ] ([Id], [Περιγραφή]) VALUES (2, N'Ηθοποιός')
GO
INSERT [dbo].[ΣΥΝΤΕΛΕΣΤΗΣ] ([Id], [Όνομα]) VALUES (1, N'Alfred Hitchcock')
GO
INSERT [dbo].[ΣΥΝΤΕΛΕΣΤΗΣ] ([Id], [Όνομα]) VALUES (2, N'Grace Kelly')
GO
INSERT [dbo].[ΣΥΝΤΕΛΕΣΤΗΣ] ([Id], [Όνομα]) VALUES (3, N'Anthony Perkins')
GO
INSERT [dbo].[Τ_Σ_Ρ] ([IDΤαινίας], [IDΣυντελεστή], [IDΡόλου]) VALUES (1, 1, 1)
GO
INSERT [dbo].[Τ_Σ_Ρ] ([IDΤαινίας], [IDΣυντελεστή], [IDΡόλου]) VALUES (1, 2, 2)
GO
INSERT [dbo].[Τ_Σ_Ρ] ([IDΤαινίας], [IDΣυντελεστή], [IDΡόλου]) VALUES (2, 1, 1)
GO
INSERT [dbo].[Τ_Σ_Ρ] ([IDΤαινίας], [IDΣυντελεστή], [IDΡόλου]) VALUES (2, 3, 2)
GO
INSERT [dbo].[ΤΑΙΝΙΑ] ([Id], [Τίτλος], [Έτος]) VALUES (1, N'Rear Window', 1954)
GO
INSERT [dbo].[ΤΑΙΝΙΑ] ([Id], [Τίτλος], [Έτος]) VALUES (2, N'Psycho', 1960)
GO
INSERT [dbo].[ΤΑΙΝΙΑ] ([Id], [Τίτλος], [Έτος]) VALUES (3, N'Ben-Hur', 1959)
GO
ALTER TABLE [dbo].[ΔΙΣΚΟΣ] WITH CHECK ADD CONSTRAINT [FK_ΔΙΣΚΟΣ_ΤΑΙΝΙΑ] FOREIGN KEY([IDΤαινίας])
REFERENCES [dbo].[ΤΑΙΝΙΑ] ([Id])
ON UPDATE CASCADE
GO
ALTER TABLE [dbo].[ΔΙΣΚΟΣ] CHECK CONSTRAINT [FK_ΔΙΣΚΟΣ_ΤΑΙΝΙΑ]
GO
ALTER TABLE [dbo].[ΕΝΟΙΚΙΑΣΗ] WITH CHECK ADD CONSTRAINT [FK_ΕΝΟΙΚΙΑΣΗ_ΔΙΣΚΟΣ] FOREIGN KEY([IDΔίσκου])
REFERENCES [dbo].[ΔΙΣΚΟΣ] ([Id])
ON UPDATE CASCADE
GO
ALTER TABLE [dbo].[ΕΝΟΙΚΙΑΣΗ] CHECK CONSTRAINT [FK_ΕΝΟΙΚΙΑΣΗ_ΔΙΣΚΟΣ]
GO
ALTER TABLE [dbo].[ΕΝΟΙΚΙΑΣΗ] WITH CHECK ADD CONSTRAINT [FK_ΕΝΟΙΚΙΑΣΗ_ΠΕΛΑΤΗΣ] FOREIGN KEY([IDΠελάτη])
REFERENCES [dbo].[ΠΕΛΑΤΗΣ] ([Id])
ON UPDATE CASCADE
GO
ALTER TABLE [dbo].[ΕΝΟΙΚΙΑΣΗ] CHECK CONSTRAINT [FK_ΕΝΟΙΚΙΑΣΗ_ΠΕΛΑΤΗΣ]
GO
ALTER TABLE [dbo].[Τ_Σ_Ρ] WITH CHECK ADD CONSTRAINT [FK_Τ_Σ_Ρ_ΡΟΛΟΣ] FOREIGN KEY([IDΤαινίας])
REFERENCES [dbo].[ΡΟΛΟΣ] ([Id])
GO
ALTER TABLE [dbo].[Τ_Σ_Ρ] CHECK CONSTRAINT [FK_Τ_Σ_Ρ_ΡΟΛΟΣ]
GO0
ALTER TABLE [dbo].[Τ_Σ_Ρ] WITH CHECK ADD CONSTRAINT [FK_Τ_Σ_Ρ_ΣΥΝΤΕΛΕΣΤΗΣ] FOREIGN KEY([IDΣυντελεστή])
REFERENCES [dbo].[ΣΥΝΤΕΛΕΣΤΗΣ] ([Id])
ON UPDATE CASCADE
GO
ALTER TABLE [dbo].[Τ_Σ_Ρ] CHECK CONSTRAINT [FK_Τ_Σ_Ρ_ΣΥΝΤΕΛΕΣΤΗΣ]
GO
ALTER TABLE [dbo].[Τ_Σ_Ρ] WITH CHECK ADD CONSTRAINT [FK_Τ_Σ_Ρ_ΤΑΙΝΙΑ] FOREIGN KEY([IDΤαινίας])
REFERENCES [dbo].[ΤΑΙΝΙΑ] ([Id])
ON UPDATE CASCADE
GO
ALTER TABLE [dbo].[Τ_Σ_Ρ] CHECK CONSTRAINT [FK_Τ_Σ_Ρ_ΤΑΙΝΙΑ]
GO
Πίνακας Περιεχομένων / Περιεχόμενα Κεφαλαίου
ΠΕΛΑΤΕΣ (Πελάτης_Id, Όνομα, Περιοχή_Id)
ΠΕΡΙΟΧΕΣ (Περιοχή_Id, Περιγραφή)
ΑΚΙΝΗΤΑ(Ακίνητο_Id, Περιοχή_Id, Τύπος, Τετραγωνικά, τιμή_εκκίνησης)
ΑΓΟΡΑΠΩΛΗΣΙΕΣ (Πελάτης_id, Ακίνητο_id, Ημερομηνία, Ποσό_αγοράς)
Πελάτης_id |
Όνομα |
Περιοχή_id |
1 |
ΜIXALIS |
1 |
2 |
BASILIS |
2 |
3 |
KOSTAS |
3 |
Πίνακας 2.14 ΠΕΛΑΤΕΣ
Περιοχή _id |
Περιγραφή |
1 |
ΚALAMARIA |
2 |
KRINI |
3 |
PILEA |
Πίνακας 2.15 ΠΕΡΙΟΧΕΣ
Aκίνητο_id |
Περιοχή_id |
Τύπος |
Τετραγωνικά |
Τιμή_εκκίνησης |
1 |
1 |
DIAMERISMA |
100 |
9000 |
2 |
2 |
KATASTIMA |
150 |
14000 |
3 |
3 |
MEZONETA |
200 |
19000 |
Πίνακας 2.16 AKINHTA
Πελάτης_id |
Aκίνητο_id |
Ημερομηνία |
Ποσό_αγοράς |
2 |
1 |
1/17/1990 |
10000 |
2 |
2 |
2/18/1995 |
15000 |
Πίνακας 2.17 ΑΓΟΡΑΠΩΛΗΣΙΕΣ
Πίνακας Περιεχομένων / Περιεχόμενα Κεφαλαίου
Hoffer, J. A., Venkatarama, R., & Topi, H. (2013). Modern Database Management, Prentice Hall.
Μανωλόπουλος, Ι., & Παπαδόπουλος, Α. Ν. (2006). Συστήματα Βάσεων Δεδομένων: Θεωρία & Πρακτική Εφαρμογή, Αθήνα, Εκδόσεις Νέων Τεχνολογιών.
Ramakrishnan, R., & Gehrke, J. (2003). Database Management Systems, McGraw-Hill.
Πίνακας Περιεχομένων / Περιεχόμενα Κεφαλαίου