4.1.2+Δημιουργία+πίνακα

4.1.2 Δημιουργία Πίνακα
**Στόχοι / Προσδοκώμενα Αποτελέσματα** Ο μαθητής/τρια πρέπει να είναι ικανός/ή:
 * να δημιουργεί πίνακες σε περιβάλλον ΣΣΔΒΔ
 * να καθορίζει περιορισμούς στα πεδία σχεσιακών πινάκων
 * να αναγνωρίζει και να καθορίζει το κύριο κλειδί σε σχεσιακούς πίνακες και να τους δημιουργεί με κύριο κλειδί σε περιβάλλον ΣΣΔΒΔ
 * να αναγνωρίζει τα ξένα κλειδιά σε σχεσιακούς πίνακες και να δημιουργεί περιορισμούς ξένων κλειδιών σε περιβάλλον ΣΣΔΒΔ

Μετά την παρουσίαση βασικών τύπων δεδομένων μπορούμε να δημιουργήσουμε πίνακες χρησιμοποιώντας τη γλώσσα SQL. Η εντολή της SQL που μας δίνει αυτή τη δυνατότητα είναι η CREATE TABLE, η οποία χρησιμοποιείται ως εξής:

code format="sql" CREATE TABLE <όνομα_πίνακα> (	<όνομα στήλης 1>      <τύπος στήλης 1>,	<όνομα στήλης 2>       <τύπος στήλης 2>,	…	<όνομα στήλης Ν>       <τύπος στήλης Ν> ) code

Δηλαδή, ξεκινάμε δηλαδή με τη φράση CREATE TABLE, ακολουθούμενη από έναν ή περισσότερους κενούς χαρακτήρες και κατόπιν γράφουμε το όνομα του πίνακα που θέλουμε να δημιουργήσουμε. Κατόπιν ανοίγουμε παρένθεση ‘(‘ και γράφουμε τα ονόματα και τους τύπους δεδομένων των στηλών του πίνακα. Για κάθε στήλη (πεδίο) του πίνακα καθορίζουμε το όνομά της και μετά από ένα ή περισσότερα κενά τον τύπο δεδομένων της στήλης. Οι τύποι δεδομένων είναι αυτοί που παρουσιάστηκαν στην προηγούμενη ενότητα. Οι ορισμοί των στηλών μεταξύ τους διαχωρίζονται με κόμμα ‘,’. Όταν ολοκληρωθεί ο ορισμός των στηλών κλείνουμε την παρένθεση ‘)’. Κενός χαρακτήρας πρέπει να υπάρχει ανάμεσα στο όνομα και τον τύπο κάθε στήλης. Αν επιστρέψουμε στα παραδείγματά μας, για να δημιουργήσουμε τον πίνακα Μάθημα, θα γράψουμε την εξής εντολή:

code format="sql" CREATE TABLE Μάθημα ( Όνομα VARCHAR(100),  Ώρες INTEGER ) code

Ο πίνακας Μάθημα αποτελείται από δύο πεδία: Όνομα και Ώρες. Ο τύπος του πεδίου "Όνομα" είναι συμβολοσειρά μέχρι 100 χαρακτήρων (VARCHAR(100)), ενώ ο τύπος του πεδίου "Ώρες" είναι ακέραιος αριθμός (INTEGER).

Για να δημιουργήσουμε τον πίνακα Μαθητής όπως παρουσιάζεται στην Εικόνα 4-4, προσθέτοντας το πεδίο «Φύλο», θα γράψουμε την εξής εντολή:

code format="sql" CREATE TABLE Μαθητής ( Επώνυμο VARCHAR(50), Όνομα VARCHAR (50), Πατρώνυμο VARCHAR (50), Ημερομηνία_Γέννησης DATE, Φύλο CHAR(1) ) code

Τα πεδία αλφαριθμητικού τύπου «Επώνυμο», «Όνομα» και «Πατρώνυμο» είναι τύπου χαρακτήρα μεταβλητού μεγέθους με μήκος έως 50, δηλαδή VARCHAR(50). Το πεδίο «Ημερομηνία_Γέννησης» είναι τύπου ημερομηνίας, δηλαδή DATE, ενώ το πεδίο «Φύλο» είναι ένας χαρακτήρας (‘Α’ ή ‘Θ’).

Προκαθορισμένες τιμές και περιορισμοί στις τιμές των πεδίων
Κατά τη δημιουργία πινάκων με την εντολή CREATE TABLE μπορούν να καθοριστούν προκαθορισμένες τιμές και περιορισμοί για τα πεδία των πινάκων.

Κατά την εισαγωγή δεδομένων σε έναν πίνακα, είναι πιθανό κάποιες τιμές πεδίων να μην είναι γνωστές, οπότε να μην εισάγονται. Σε αυτή την περίπτωση, το πεδίο θα έχει την τιμή NULL, που σημαίνει ότι δεν έχει εισαχθεί τιμή. Για παράδειγμα όταν γίνονται εγγραφές μαθητών στο Μαθητολόγιο του σχολείου, μπορεί να μην εισάγεται η ημερομηνία γέννησης του μαθητή μέχρι εκείνος να προσκομίσει το πιστοποιητικό γέννησης. Σε αυτή την περίπτωση η ημερομηνία γέννησης έχει την τιμή NULL μέχρι να γίνει εισαγωγή μιας έγκυρης ημερομηνίας. Για παράδειγμα, αν στο Μαθητολόγιο καταχωρείται η πόλη καταγωγής των μαθητών ενός σχολείου, το πεδίο αυτό θα μπορούσε να έχει προκαθορισμένη τιμή συγκεκριμένη πόλη π.χ. «Αθήνα» αν πρόκειται για σχολείο της Αθήνας και αναμένεται οι περισσότεροι μαθητές να έχουν καταγωγή από την Αθήνα. Σε αυτή την περίπτωση η προκαθορισμένη τιμή διευκολύνει την εισαγωγή δεδομένων εφόσον δεν είναι απαραίτητο να εισάγεται με κάθε νέο μαθητή, αλλά δημιουργείται αυτόματα από το σύστημα. Στην γλώσσα SQL, οι προκαθορισμένες τιμές περιγράφονται στην εντολή CREATE TABLE με την σύνταξη DEFAULT  <τιμή> δίπλα από την περιγραφή της αντίστοιχης στήλης. Το παράδειγμα δημιουργίας του πίνακα Μαθητής θα γινόταν επομένως :
 * Προκαθορισμένη τιμή πεδίων**
 * Προκαθορισμένη τιμή (default value)** σε ένα πεδίο σημαίνει ότι αν δεν καθοριστεί άλλη τιμή κατά την εισαγωγή δεδομένων, χρησιμοποιείται μία τιμή που έχει καθορίσει ο σχεδιαστής της Βάσης Δεδομένων.

code format="sql" CREATE TABLE Μαθητής ( Επώνυμο VARCHAR(50), Όνομα VARCHAR (50), Πατρώνυμο VARCHAR (50), Ημερομηνία_Γέννησης DATE, Φύλο CHAR(1), Πόλη VARCHAR(50) DEFAULT 'Αθήνα' ) code

Συχνά είναι αναγκαίο να επιβληθούν περιορισμοί στα δεδομένα για να εξασφαλιστεί η ορθότητα και η ακεραιότητά τους. Οι περιορισμοί με τους οποίους θα ασχοληθούμε σε αυτήν την υποενότητα είναι: περιορισμοί υπαρξιακής ακεραιότητας, περιορισμοί κύριου κλειδιού και περιορισμοί αναφορικής ακεραιότητας.
 * Περιορισμοί**

Οι περιορισμοί αυτοί μπορεί να αφορούν στην ύπαρξη ή μη τιμών σε κάποιο πεδίο πίνακα και εκφράζονται σε γλώσσα SQL με τις φράσεις NULL και NOT NULL. Η λέξη «NULL» σημαίνει καμία τιμή και χρησιμοποιείται για πεδία που είναι αποδεκτό να μην έχουν τιμή, ενώ η φράση «NOT NULL» χρησιμοποιείται για πεδία που δεν επιτρέπεται να μην έχουν τιμή. Στο παράδειγμα του Μαθητολογίου, η καταχώρηση μαθημάτων χωρίς τίτλους δεν είναι αποδεκτή, οπότε η δημιουργία του πίνακα Μάθημα θα έπρεπε να γραφτεί προσθέτοντας δίπλα στο πεδίο «Όνομα» τη φράση NOT NULL, ως εξής:
 * //Περιορισμοί υπαρξιακής ακεραιότητας//**

code format="sql" CREATE TABLE Μάθημα ( Όνομα VARCHAR(100) NOT NULL, Ώρες INT ) code

Παρόμοια, στον πίνακα Μαθητής, η καταχώρηση μαθητών χωρίς το ονοματεπώνυμό τους δεν είναι αποδεκτή, οπότε και στα δύο πεδία καθορίζεται ο περιορισμός NOT NULL ώστε να αποφευχθεί η εισαγωγή μαθητών χωρίς ονοματεπώνυμο.

code format="sql" CREATE TABLE Μαθητής ( Επώνυμο VARCHAR(50) NOT NULL, Όνομα VARCHAR (50) NOT NULL, Πατρώνυμο VARCHAR (50), Ημερομηνία_Γέννησης DATE, Φύλο CHAR(1), Πόλη VARCHAR(50) DEFAULT 'Αθήνα' ) code

Το κύριο κλειδί ενός σχεσιακού πίνακα είναι ένα πεδίο ή συνδυασμός πεδίων που για κάθε γραμμή του πίνακα έχει μοναδική τιμή. Ο περιορισμός του κύριου κλειδιού μπορεί να καθοριστεί στην εντολή CREATE TABLE με τη σύνταξη PRIMARY KEY (<πεδίο ή πεδία>). Η φράση PRIMARY KEY (<πεδίο ή πεδία>) προστίθεται μετά τον ορισμό των στηλών του πίνακα στην εντολή CREATE TABLE.
 * //Περιορισμοί κύριου κλειδιού//**

Ας επανέλθουμε στο παράδειγμα του Μαθητολογίου και στον πίνακα Μάθημα που δημιουργήθηκε προηγουμένως. Ένας ορθός σχεδιασμός της βάσης δεδομένων επιβάλλει τον καθορισμό κύριου κλειδιού σε όλους τους πίνακες που θα δημιουργηθούν. Άρα στον πίνακα Μάθημα πρέπει να προστεθεί κύριο κλειδί. Σε αυτή την περίπτωση επιλέγουμε ως κύριο κλειδί το όνομα του μαθήματος, το οποίο θεωρούμε ότι είναι μοναδικό, π.χ. «Φυσική Α’ Τάξης», «Μαθηματικά Γ’ Τάξης», κ.ο.κ. Άρα η δημιουργία του πίνακα Μάθημα θα συμπληρωθεί ως εξής:

code format="sql" CREATE TABLE Μάθημα ( Όνομα VARCHAR(100) NOT NULL,  Ώρες INTEGER,  PRIMARY KEY (Όνομα) ) code

Στο παράδειγμα του Μαθητολογίου, θέλουμε οι μαθητές επίσης να διακρίνονται μεταξύ τους με μοναδικό τρόπο. Αυτό εφαρμόζεται και στην πράξη στο μητρώο μαθητών του σχολείου. Κατά την εγγραφή του στο βιβλίο του μητρώου μαθητών, κάθε μαθητής αποκτά έναν μοναδικό Αριθμό Μητρώου. Στην Βάση Δεδομένων Μαθητολόγιο αυτό υλοποιείται με την προσθήκη του πεδίου ΑΜ στον πίνακα Μαθητής και τον καθορισμό του πεδίου ως κύριου κλειδιού ως εξής:

code format="sql" CREATE TABLE Μαθητής ( ΑΜ INT, Επώνυμο	VARCHAR(50) NOT NULL, Όνομα VARCHAR (50) NOT NULL, Πατρώνυμο VARCHAR (50), Ημερομηνία_Γέννησης DATE, Φύλο CHAR(1), Πόλη VARCHAR(50) DEFAULT 'Αθήνα', PRIMARY KEY (ΑΜ) ) code

Αυτό σημαίνει ότι στον πίνακα δε μπορούν να εισαχθούν δύο μαθητές με τον ίδιο Αριθμό Μητρώου.
 * //Περιορισμοί αναφορικής ακεραιότητας//**

Οι περιορισμοί αναφορικής ακεραιότητας καθορίζουν συσχετίσεις μεταξύ των πεδίων διαφορετικών πινάκων, δηλαδή τα ξένα κλειδιά. Ο περιορισμός ξένου κλειδιού στην γλώσσα SQL καθορίζει ότι το πεδίο ενός πίνακα Β αναφέρεται σε ένα πεδίο ενός άλλου πίνακα Α, επομένως οι τιμές του πεδίου στον πίνακα Β πρέπει να υπάρχουν στο αντίστοιχο πεδίο στον πίνακα Α. Οι περιορισμοί αναφορικής ακεραιότητας περιγράφονται στη γλώσσα SQL με την έκφραση FOREIGN KEY (<πεδίο>) REFERENCES <πίνακας αναφοράς> ( <πεδίο πίνακα αναφοράς>).

Στο παράδειγμά μας του Μαθητολογίου, οι μαθητές του σχολείου εγγράφονται κάθε χρόνο που φοιτούν σε συγκεκριμένη τάξη (Α, Β, ή Γ). Κάθε μαθητής που θα φοιτήσει παραπάνω από ένα έτος στο ίδιο σχολείο θα εγγραφεί τουλάχιστον μία φορά σε κάθε τάξη που θα φοιτήσει. Για να καταγραφεί αυτή η πληροφορία στη σχεσιακή Βάση Δεδομένων, θα πρέπει να δημιουργηθεί ένας νέος πίνακας ο οποίος να επιτρέπει την εγγραφή μαθητών σε σχολικά έτη και τάξεις. Σε αυτόν τον πίνακα που μπορούμε να τον ονομάσουμε ΕγγραφήΜαθητή, αυτό που πρέπει να δημιουργηθεί είναι ένα πεδίο που να ταυτοποιεί κάθε μαθητή. Το πεδίο αυτό είναι ο αριθμός μητρώου (ΑΜ) του μαθητή. Ο ΑΜ μαθητή πρέπει να συνοδεύεται και από το σχολικό έτος και την τάξη στην οποία εγγράφεται ο μαθητής. Άρα ο πίνακας ΕγγραφήΜαθητή θα έχει την εξής μορφή:

Εικόνα 4-5. Ο σχεσιακός πίνακας «ΕγγραφήΜαθητή» (ΑΜ_Μαθητή, Σχολ_έτος, Τάξη)
 * ~ ΑΜ_Μαθητή	||~ Σχολ_έτος	||~ Τάξη||

Το πεδίο ΑΜ_Μαθητή αναφέρεται σε μαθητές που είναι ήδη καταχωρημένοι στον πίνακα Μαθητής. Για να εξασφαλιστεί αυτή η //αναφορική ακεραιότητα//, το πεδίο ΑΜ_Μαθητή πρέπει να είναι //ξένο κλειδί// που αναφέρεται στο πεδίο ΑΜ του πίνακα Μαθητής.

Ένα επιπλέον σημείο που πρέπει να διευκρινιστεί για τον συγκεκριμένο πίνακα, είναι το κύριο κλειδί του, δηλαδή το πεδίο ή τα πεδία που πρέπει να είναι μοναδικά για κάθε εγγραφή. Ας κάνουμε μερικές παρατηρήσεις: Επομένως το κύριο κλειδί θα είναι συνδυασμός κάποιων πεδίων. Συγκεκριμένα, θα είναι ο συνδυασμός των πεδίων (ΑΜ_Μαθητή, Σχολ_έτος) ώστε να εξασφαλίζεται ότι κάθε μαθητής θα εγγράφεται μόνο μία φορά ανά σχολικό έτος σε κάποια τάξη.
 * Ο ΑΜ_Μαθητή δε μπορεί να είναι μοναδικός γιατί κάθε μαθητή μπορεί να γίνουν πολλές εγγραφές (στην Α’, τη Β’ και τη Γ’ τάξη)
 * Το πεδίο Σχολ_έτος δε μπορεί να είναι μοναδικό γιατί σε κάθε σχολικό έτος εγγράφονται πολλοί μαθητές στο σχολείο.

Άρα η δημιουργία του πίνακα μπορεί να γίνει με την εξής εντολή SQL:

code format="sql" CREATE TABLE ΕγγραφήΜαθητή ( ΑΜ_Μαθητή ΙΝΤ,  Σχολ_έτος CHAR(9),  Τάξη CHAR(1),  PRIMARY KEY (ΑΜ_Μαθητή, Σχολ_έτος),  FOREIGN KEY (ΑΜ_Μαθητή) REFERENCES Μαθητής(ΑΜ) ) code Παρατηρούμε ότι ο τύπος του πεδίο ΑΜ_Μαθητή είναι ΙΝΤ, ίδιος με τον τύπο του πεδίου ΑΜ στον πίνακα Μαθητής. Αυτή είναι απαραίτητη προϋπόθεση για την δημιουργία του περιορισμού ξένου κλειδιού (FOREIGN KEY) στον πίνακα ΕγγραφήΜαθητή.

Στο ίδιο παράδειγμα, ένας μαθητής παίρνει γραπτό βαθμό στα μαθήματα της τάξης που ένας μαθητής παίρνει έναν γραπτό βαθμό στα μαθήματα της τάξης που παρακολουθεί για κάθε σχολικό έτος που φοιτά στο σχολείο. Άρα υπάρχει συσχέτιση ανάμεσα στον μαθητή και τα μαθήματα για την καταχώρηση της γραπτής βαθμολογίας. Η συσχέτιση αυτή πρέπει να υλοποιηθεί στη σχεσιακή Βάση Δεδομένων με ένα νέο πίνακα ο οποίος θα συσχετίζει τον Αριθμό Μητρώου του μαθητή με το μάθημα στο οποίο καταχωρείται η βαθμολογία του, συμπληρωμένο με το σχολικό έτος. Σε αυτόν τον πίνακα, το κύριο κλειδί, δηλαδή το πεδίο που πρέπει να είναι μοναδικό για κάθε εγγραφή στον πίνακα είναι ο συνδυασμός των πεδίων Αριθμός Μητρώου Μαθητή, Σχολικό Έτος και Όνομα Μαθήματος, έτσι ώστε:
 * να είναι δυνατό να εισαχθούν βαθμοί για όλα τα (διαφορετικά) μαθήματα κάποιου μαθητή,
 * να μην είναι δυνατόν να εισαχθεί παραπάνω από ένας βαθμός ανά μαθητή, μάθημα και σχολικό έτος,
 * να είναι δυνατόν να εισαχθούν οι βαθμοί όλων των μαθητών σε κάθε μάθημα που παρακολουθούν,
 * να είναι δυνατόν να εισαχθούν βαθμοί κάποιου μαθητή στο ίδιο μάθημα για διαφορετικά σχολικά έτη σε περίπτωση επανάληψης της ίδιας τάξης (κάτι που δεν είναι επιθυμητό φυσικά αλλά πρέπει να προβλεφθεί στο ΣΔΒΔ).

Επομένως η δημιουργία του πίνακα για τις γραπτές βαθμολογίες θα έχει ως εξής:

code format="sql" CREATE TABLE ΓραπτόςΒαθμόςΜαθητή ( ΑΜ_Μαθητή INT, Σχολ_έτος CHAR(9), Όνομα_Μαθήματος VARCHAR(100), Βαθμός FLOAT, PRIMARY KEY (ΑΜ_Μαθητή, Σχολ_έτος, Όνομα_Μαθήματος), FOREIGN KEY (ΑΜ_Μαθητή) REFERENCES Μαθητής(ΑΜ), FOREIGN KEY (Όνομα_Μαθήματος) REFERENCES Μάθημα(Όνομα) ) code Παρατηρούμε ότι ο τύπος του πεδίο ΑΜ_Μαθητή είναι ΙΝΤ, ίδιος με τον τύπο του πεδίου ΑΜ στον πίνακα Μαθητής και ο τύπος του πεδίου Όνομα_Μαθήματος είναι VARCHAR(100), ίδιος με τον τύπο του πεδίου Όνομα στον πίνακα Μάθημα.

Στο **Παράρτημα 4.2: Δημιουργία Πινάκων στο Σχεσιακό ΣΔΒΔ MySQL** παρουσιάζεται συνοπτικά η δημιουργία πινάκων στο περιβάλλον του ΣΔΒΔ MySQL με τη χρήση του εργαλείου MySQL Workbench.

**Ερωτήσεις / Δραστηριότητες** 1)	Ανατρέξτε στην Άσκηση 1 της προηγούμενης ενότητας, με τα παρακάτω δεδομένα που αφορούν σε βιβλία: α) Περιγράψτε πιθανούς περιορισμούς που να αφορούν στα παραπάνω δεδομένα. β) Εντοπίστε το κύριο κλειδί του πίνακα ή αν είναι απαραίτητο προτείνεται την προσθήκη κατάλληλου κύριου κλειδιού στον πίνακα. γ) Γράψτε και εκτελέστε την εντολή της SQL για την δημιουργία του πίνακα.
 * Ιλιάδα||Όμηρος||2003||18,37||
 * Ερωτόκριτος||Κορνάρος, Βιτσέντζος	||1985	||12,75||