Department of Computer Science University of Cyprus EPL342 Databases Lecture 13: SQL DDL II SQL Data Definition Language (Chapter 8.2-8.3, Elmasri-Navathe 5ED) + ΤransactSQL Reference Guide http://msdn.microsoft.com/en-us/library/bb510741.aspx Demetris Zeinalipour http://www.cs.ucy.ac.cy/courses/epl342 13-1
Πεξηερόκελν Γηάιεμεο Κεθάιαην 8.2-8.3: SQL DDL II Εηζαγωγή ζηελ SQL Σύπνη Δεδνκέλωλ ηεο SQL 1999 Αξηζκνί, Σπκβνινζεηξέο, Γπαδηθέο Αθνινπζίεο, Λνγηθνί Τύπνη, Ηκεξνκελίεο & Ώξα, Φξνλόζεκα, θ.α. TSQL: Σπλαξηήζεηο Ηκεξνκελίαο, Απηόκαηε Αύμεζε Τηκήο, Υπνινγηδόκελα Γλωξίζκαηα, Δμεηδηθεπκέλνη Τύπνη Οξηζκόο Δεδνκέλωλ (CREATE/DROP/ALTER) Γεκηνπξγία, Γηαγξαθή θαη Τξνπνπνίεζε Πηλάθωλ Πεξηνξηζκνί (CONSTRAINTS) Οληόηεηαο, Αλαθνξηθήο Αθεξαηόηεηαο, Ολνκαζία, Δληνιέο Δλεξγνπνίεζεο Αλαθνξάο, Πξνζωξηλή Απελεξγνπνίεζε Πεξηνξηζκώλ, θ.α. 13-2
Τύπνη Γεδνκέλωλ ηεο SQL (πλαξηήζεηο Ηκεξνκελίαο θαη Ώξαο) Πέξα από ηνπο ηύπνπο γηα εκεξνκελίεο, όια ηα ζπζηήκαηα παξέρνπλ θαη ζπλαξηήζεηο: Eπεμεξγαζίαο ηεο ώξαο/εκεξνκελίαο Πξόζζεζε Ηκεξνκεληώλ / Ωξώλ, Δμαγωγή κήλα, εκέξαο, ή ρξνλνινγίαο από κηα εκεξνκελία, Εκθάληζε εκεξνκελίαο κε δηάθνξνπο ηξόπνπο, θηι. Απηέο ζα αμηνπνηεζνύλ αξγόηεξα από ηελ SQL-DML Παξαδείγκαηα πλαξηήζεωλ από ηνλ SQL Server: DATEDIFF ( datepart, startdate, enddate ) SELECT DATEDIFF(year, '2005-12-31' '2006-01-01'); Returns 1 DATEADD (datepart, number, date ) SELECT DATEADD(month, 1, '2006-08-30'); Returns 2006-09-30 DATEPART(datepart, date ) SELECT DATEPART(year, 0); Returns: 1900 ISDATE ( expression ) SELECT ISDATE('04/15/2008'); Returns 1 Datepart: year, month, dayofyear, day,week, weekday,hour,sec ond,millisecond 13-3
Τύπνη Γεδνκέλωλ ηεο SQL (Απηόκαηε Αύμεζε Σηκήο - Autoincrement ) Σε πνιιέο πεξηπηώζεηο είλαη ρξήζηκν λα δεκηνπξγνύληαη απηόκαηα θάπνηνη κνλαδηθνί αξηζκνί από ηελ βάζε δεδνκέλωλ (π.ρ., γηα λα ρξεζηκνπνηεζνύλ ωο πξωηεύωλ θιεηδηά) Π.ρ., Καηά ηελ εηζαγωγή πξνϊόληωλ (products) ζε κηα βάζε ζέινπκε λα παξάγεηαη απηόκαηα ην θιεηδί PID. Δάλ θαη ε SQL:99 δελ έρεη πξόλνηα γηα έλα ηέηνην ηύπν, όιεο νη βάζεηο ηνλ πινπνηνύλ κε θάπνην ηξόπν. Σπγθεθξηκέλα, ην Auto-increment πινπνηείηαη ωο εηδηθό ηύπν αθεξαίνπ ν νπνίνο απμάλεηαη απηόκαηα PostgreSQL: Serial: Από 1 κέρξη 2147483647 Auto-increment Bigserial: Από 1 κέρξη 9223372036854775807 Microsoft Access: Autonumber Oracle: CREATE SEQUENCE command SQL Server 2008: IDENTITY 13-4
Τύπνη Γεδνκέλωλ ηεο SQL (Απηόκαηε Αύμεζε Σηκήο - Autoincrement ) Σην SQL Server 2008, ε απηόκαηε αύμεζε γίλεηαη κέζω ηνπ IDENTITY, ην νπνίν δίλεηαη ωο γλώξηζκα ζηελ εληνιή CREATE TABLE, δει: IDENTITY [ ( seed, increment ) ] Seed: Αξρή Αξίζκεζεο, Increment: Αύμεζε Μεηξεηή Η εμ νξηζκνύ ηηκή είλαη (1,1) ή πξέπεη λα νξίδνληαη θαη ηα δπν. Παξάδεηγκα Υξήζεο CREATE TABLE Products ( PID int IDENTITY(1,1) PRIMARY KEY,.) Επηζεκάλζεηο: Τν IDENTITY ρξεζηκνπνηείηαη ζε ζπλδπαζκό κε θάπνηα αξηζκεηηθή ηηκή (tinyint, smallint, bigint, dec(p,0)) πξάμε κόλν κε int ή bigint. Δάλ θάλνπκε DROP ή TRUNCATE έλα πίλαθα ηόηε ν counter ηνπ IDENTITY κεδελίδεηαη (γηα απηό λα ρξεζηκνπνηείηαη ην DELETE) Δάλ ρξεζηκνπνηείηαη ωο PRIMARY KEY ρξεηάδεηαη πξνζνρή εηδηθά εάλ ηα δεδνκέλα πξόθεηηαη λα θνξηωζνύλ ζηε βάζε δεδνκέλωλ. Όκνηα, ν ηύπνο δεδνκέλωλ UniqueIdentifier (GUID) είλαη 16byte ζπκβνινζεηξά, π.ρ., '6F9619FF-8B86-D011-B42D-00C04FC964FF ε νπνία αλαηίζεηαη απηόκαηα κε DEFAULT NEWID() 13-5
Τύπνη Γεδνκέλωλ ηεο SQL (Τπνινγηδόκελα Γλωξίζκαηα - Computed Columns) Σε θάπνηεο πεξηπηώζεηο είλαη ρξήζηκν λα δεκηνπξγνύληαη απηόκαηα θάπνηα γλωξίζκαηα βάζεη άιιωλ γλωξηζκάηωλ Π.ρ., ListPrice = Price * 1.2; Οξηζκέλεο βάζεηο δεδνκέλωλ, όπωο ν SQL Server ππνζηεξίδνπλ ηελ έλλνηα ηωλ Τπνινγηδόκελωλ Γλωξηζκάηωλ (Computed Columns) ηα νπνία γλωξηζκαηα δελ ππάξρνπλ αιιά ππνινγίδνληαη θαηά ηελ αλαθνξά ηνπο. CREATE TABLE Grades ( Midterm float, Final float, Exercise float, FinalGrade AS 0.25*Midterm + 0.5*Final + 0.25*Exercises) Μεηνλεθηήκαηα Γελ είλαη ζπκβαηό κε ηελ SQL:99 νπόηαλ ππάξρνπλ πξνβιήκαηα κεηαθεξζηκόηεηαο (portability) ηνπ θώδηθα Σε αξθεηέο πεξηπηώζεηο, πνιιέο ιεηηνπξγίεο δελ ππνζηεξίδνληαη (π.ρ., επξεηήξηα, πεξηνξηζκνί, θηι.) 13-6
Τύπνη Γεδνκέλωλ ηεο SQL (Γεκηνπξγία Εμεηδηθεπκέλωλ Σύπωλ Γεδνκέλωλ) Η SQL:99 παξέρεη ηελ δπλαηόηεηα δεκηνπξγίαο εμεηδηθεπκέλωλ ηύπωλ δεδνκέλωλ κέζω ηεο εληνιήο CREATE DOMAIN. Η αληίζηνηρε εληνιή ζηελ TSQL είλαη ε CREATE TYPE Παξαδείγκαηα ζε SQL:99: CREATE DOMAIN name_dom AS CHAR(20); CREATE DOMAIN sectno_dom AS SMALLINT; CREATE DOMAIN section_dom VARCHAR(20) DEFAULT 'none'; CREATE DOMAIN address_dom CHAR(50) DEFAULT NULL; CREATE DOMAIN qpa_dom DECIMAL (3,2) DEFAULT 0.00; Παξαδείγκαηα ζε ΣSQL: CREATE TYPE SSN FROM varchar(11) NOT NULL ; http://msdn.microsoft.com/en-us/library/ms175007.aspx 13-7
Τύπνη Γεδνκέλωλ ηεο SQL (Γεκηνπξγία Εμεηδηθεπκέλωλ Σύπωλ Γεδνκέλωλ) Δάλ θαη ζα δνύκε ηελ έλλνηα ηωλ πεξηνξηζκώλ αξγόηεξα, αλαθέξνπκε όηη ε SQL99 ππνζηεξίδεη πεξηνξηζκνύο CHECK θαη θαηά ηελ δεκηνπξγία εμεηδηθεπκέλωλ ηύπωλ. Παξαδείγκαηα ζε SQL:99 CREATE DOMAIN gender_dom AS CHAR(1) CHECK (VALUE IN ( 'F', 'f', 'M', 'm' )); CREATE DOMAIN gender_dom AS CHAR(1) CHECK (VALUE IN ( 'F', 'f', 'M', 'm' ) OR (VALUE IS NULL)); CREATE DOMAIN ssn_dom CHAR(11) CHECK ((VALUE BETWEEN '000-00-0000' AND '999-99-9999')); CREATE DOMAIN hour_dom AS INTEGER DEFAULT 0 CHECK (VALUE >= 0); 13-8
Οξηζκόο Γεδνκέλωλ ζηελ SQL (Γεκηνπξγία Σρήκαηνο) Σε λεόηεξεο εθδόζεηο ηνπ SQL Server κπνξνύκε λα αλαζέζνπκε επί κέξνπο αληηθείκελα ηεο βάζεο ζε επί κέξνπο Οκάδεο (δηαθνξεηηθά Σρήκαηα Βαζεο), π.ρ., Command: CREATE SCHEMA Person SQL Server 2008 Schema => Container of Objects Τν παξάδεηγκα ζηα δεμηά δείρλεη δπν νκάδεο Person θαη HumanResources. Η default νκάδα είλαη ν dbo (database owner) Σπλεπώο κηα αλαθνξά ζε έλα αληηθείκελν ρξεζηκνπνηεί ηελ έμεο ζεκεηνγξαθία: [ServerName.[DatabaseName.[SchemaName.]]].ObjectName 13-9
Οξηζκόο Γεδνκέλωλ ζηελ SQL (Γεκηνπξγία Σρήκαηνο) Γηαθνξεηηθ ά Σρήκαηα 13-10
Οξηζκόο Γεδνκέλωλ ζηελ SQL (Data Definition Language - DDL) Μηα Γλώζζα Οριζμού Δεδομένων (Data Definition Language, SQL-DDL) καο επηηξέπεη λα δεκηνπξγήζνπκε θαη λα δηαρεηξηζηνύκε ηηο δνκέο κηαο βάζεο δεδνκέλωλ. Απηό επηηπγράλεηαη κέζω θάπνηωλ εληνιώλ ηεο SQL, π.ρ.,: CREATE δεκηνπξγεί έλα αληηθείκελν βάζεο π.ρ., ζρήκα βάζεο, πίλαθα, επξεηήξην, ζθαλδάιε, ηύπν δεδ., θηι. DELETE/DROP/TRUNCATE DELETE δηαγξάθεη ζηνηρεία από ην αληηθείκελν βάζεη ζπλζήθεο (ρωξίο λα απνδεζκεύεηαη ν ρώξνο). ΣRUNCATE/DROP: δηαγξάθεη ην αληηθείκελν / δηαγξάθεη ην αληηθείκελν θαη ηελ πεξηγξαθή ηνπ απνδεζκεύνληαο θαη ηνλ ρώξν. ALTER κεηαβάιεη ηελ δνκή ελόο αληηθεηκέλνπ Π.ρ., πξνζζήθε ζηήιεο, επηπιένλ πεξηνξηζκνύ, θηι. 13-11
Οξηζκόο Γεδνκέλωλ ζηελ SQL (CREATE TABLE) Από ηελ SQL2, κπνξνύκε κε ηελ ρξήζε ηεο εληνιήο CREATE TABLE λα νξίζνπκε θαη ηνπο αθόινπζνπο πεξηνξηζκνύο: Γλωξίζκαηα Οξίδεηαη ν ηύπνο δεδνκέλωλ θάζε γλωξίζκαηνο, π.ρ., age int, Πξωηεύνληα θιεηδηά (PRIMARY KEY) Οξίδεηαη ην Κιεηδί θάζε Σρέζεο Γελ κπνξεί λα είλαη NULL Γελ είλαη απαξαίηεην λα ππάξρεη εάλ θαη ζπλίζηαηαη λα ππάξρεη Δεπηεξεύνληα θιεηδηά (UNIQUE) Οξίδνληαη ηα κνλαδηθά γλωξίζκαηα κηαο Σρέζεο (π.ρ., Dname ζην Department) Μπνξεί λα είλαη NULL (βαζηθή δηαθνξά από ηα Primary Keys) Καλόλεο Αλαθνξηθήο Αθεξαηόηεηαο (FOREIGN KEY). Γηα έλα μέλν θιεηδί, αλαθέξεη ζε πνην πξωηεύωλ θιεηδί αλαθέξεηαη θαζώο θαη εληνιήο ελεξγνπνίεζεο αλαθνξάο. (πξάμεηο αληηδξάζεηο ζε δηαγξαθέο θαη ελεκεξώζεηο) 13-12
Οξηζκόο Γεδνκέλωλ ζηελ SQL (CREATE TABLE) Παξάδεηγκα δεκηνπξγίαο πίλαθα κε βαζηθνύο πεξηνξηζκνύο θαη ρωξίο δξάζεηο αληίδξαζεο ζε δηαγξαθέο θαη ελεκεξώζεηο CREATE TABLE DEPT ( DNAME VARCHAR(10) NOT NULL [UNIQUE], DNUMBER INTEGER NOT NULL [PRIMARY KEY] ); MGRSSN CHAR(9) [REFERENCES EMP], MGRSTARTDATE CHAR(9), PRIMARY KEY (DNUMBER), UNIQUE (DNAME), FOREIGN KEY (MGRSSN) REFERENCES EMP To γλώξηζκα ΔΕΝ κπνξεί λα είλαη NULL. Default: NULL (δειαδή επηηξέπεηαη λα είλαη NULL) Γηα ζύλζεηα θιεηδηά επηβάιιεηαη λα νξίδεηαη ζην ηέινο θαη όρη δίπια από ηνλ νξηζκό ηνπ γλωξίζκαηνο. 13-13
Οξηζκόο Γεδνκέλωλ ζηελ SQL (CREATE TABLE - Παξάδεηγκα) Σεκεηώζηε όηη αθόκε δελ νξίζακε ηελ αληίδξαζε ζε δηαγξαθέο θαη ελεκεξώζεηο) Μπορούζαν να οριζηούν δίπλα από ηο γνωρίζμαηα Σύνθεηα κλειδιά ορίζονηαι πάνηα ζηο ηέλος 13-14
Οξηζκόο Γεδνκέλωλ ζηελ SQL (CREATE TABLE - Παξάδεηγκα) 13-15
Οξηζκόο Γεδνκέλωλ ζηελ SQL (CREATE TABLE Constraint Ordering) Οη αλαθνξηθνί πεξηνξηζκνί κπνξνύλ λα νξίδνληαη ζε επίπεδν i) γλωξίζκαηνο, ii) ζρέζεο ή iii) κε κεηαβνιή ζρήκαηνο (κε ALTER TABLE πνπ ζα δνύκε ζε ιίγν) Ο βνιηθόηεξνο ηξόπνο είλαη κε κεηαβνιή ζρήκαηνο εθόζνλ κπνξεί λα ππάξρνπλ πξνβιήκαηα πξνηεξαηόηεηαο όπωο ην πην θάηω θαη λα κελ κπνξνύκε λα πξνρωξήζνπκε. Πξόβιεκα Πξνζέγγηζεο (i) θαη (ii) CREATE TABLE EMPLOYEE( SSN INTEGER PRIMARY KEY, DNO INTEGER NOT NULL, FOREIGN KEY (DNO) REFERENCES CREATE TABLE DEPARTMENT( DEPARTMENT(DNO)); DNO INTEGER NOT NULL PRIMARY KEY, Μήλπκα Λάζνπο Foreign key 'FK EMPLOYEE DNO 4CA06362' references invalid table 'DEPARTMENT'. MGRSSN INTEGER NOT NULL, FOREIGN KEY (MGRSSN) REFERENCES EMPLOYEE(SSN)); 13-16
Οξηζκόο Γεδνκέλωλ ζηελ SQL (CREATE TABLE Constraint Ordering) Δπίιπζε κε κεηαβνιή ζρήκαηνο θάλνληαο ρξήζε ηνπ ALTER TABLE /* Δεκηνπξγία Πηλάθωλ ρωξίο αλαθνξηθνύο πεξηνξηζκνύο */ CREATE TABLE EMPLOYEE( SSN INTEGER PRIMARY KEY, DNO INTEGER NOT NULL); CREATE TABLE DEPARTMENT( DNO INTEGER NOT NULL PRIMARY KEY, MGRSSN INTEGER NOT NULL); H ALTER ζα κειεηεζεί εθηελεζηέξα ζε ιίγν /* Δεκηνπξγία Αλαθνξηθώλ Πεξηνξηζκώλ κε ALTER TABLE */ ALTER TABLE EMPLOYEE ADD CONSTRAINT FOREIGN KEY (DNO) REFERENCES DEPARTMENT(DNO)); ALTER TABLE DEPARTMENT ADD CONSTRAINT FOREIGN KEY (MGRSSN) REFERENCES EMPLOYEE(SSN)); 13-17
Γηαγξαθή Γεδνκέλωλ ζηελ SQL (DROP TABLE) H Drop ρξεζηκνπνηείηαη γηα λα αθαηξέζεη κηα ζρέζε θαη ηνλ νξηζκό ηεο (ζρήκα) από ηνλ θαηάινγν ηεο βάζεο: Π.ρ., DROP TABLE EMPLOYEE, DEPARTMENT,,n; A. Γελ επηηξέπεηαη λα θάλνπκε DROP πίλαθα πνπ αλαθέξεηαη από θάπνην άιιν πίλαθα (πξώηα DROP ηα constraint ) ALTER TABLE dbo.employee DROP CONSTRAINT fk_dno B. Μπνξνύκε λα θάλνπκε DROP πνιιαπινύο πίλαθεο δεδνκέλνπ ηνπ όηη ηνπο θάλνπκε drop κε αθνινπζία πνπ δελ επεξεάδεη ην ζεκείν Α DELETE δηαγξάθεη εγγξαθέο βάζεη ζπλζήθεο θαη θαηαγξάθνληαο ηηο αιιαγέο ζε έλα θαηάζηηρν (LOG) Π.ρ., DELETE [*] FROM DEPENDENT [WHERE condition]; ΣRUNCATE: δηαγξάθεη ΟΛΔΣ ηηο εγγξαθέο κηαο ζρέζεο θαη δελ θαηαγξάθεη ηηο αιιαγέο ζε θαηάζηηρν (LOG) Π.ρ., TRUNCATE TABLE DEPENDENT; 13-18
Δμέιημε Σρήκαηνο Πηλάθωλ (Η εληνιή ALTER) H εληνιή ALTER καο επηηξέπεη ηελ κεηεμέιημε ηνπ ζρήκαηνο κηαο βάζεο (π.ρ., πξνζζήθε ή αιιαγή πεδίνπ, πεξηνξηζκώλ, θηι.) Αο δνύκε θάπνηα παξαδείγκαηα (δείηε θαη ηα παξαδείγκαηα ηνπ εξγαζηεξίνπ) A) Προζθήκη Γνωρίζμαηος ALTER TABLE Company.Employee ADD COLUMN LastRaise date; Παραηηρήζεις Η ζηήλη δημιοσργείηαι αλλά θέρει ηην ηιμή NULL. Μπορούμε να κάνοσμε ηα ακόλοσθα: Πξνζζήθε ηαζεξήο Σηκήο ADD COLUMN LastRaise date NOT NULL DEFAULT 2009-01-01 Πξνζζήθε Μεηαβαιιόκελεο Σηκήο (κέζω ζπλάξηεζεο TSQL) ADD COLUMN LastRaise date NOT NULL DEFAULT GETDATE() Σν DEFAULT ζα κειεηεζεί εθηελεζηέξα ζηε ζπλέρεηα 13-19
Δμέιημε Σρήκαηνο Πηλάθωλ (Η εληνιή ALTER) Β) Διαγραθή Γνωρίζμαηος ALTER TABLE Company.Employee DROP COLUMN LastRaise; Παραηηρήζεις Eαλ ε ζηήιε ππό δηαγξαθή αλαθέξεηαη από θάπνηα άιιε ζρέζε ηόηε δελ είλαη εθηθηή ε δηαγξαθή (εθόζνλ παξαβηάδεηαη ν θαλόλαο αλαθνξηθήο αθεξαηόηεηαο). Σηελ SQL:99 (όρη ΤSQL) ππάξρεη ε έλλνηα ηνπ CASCADE ALTER TABLE tname DROP COLUMN cname CASCADE; ην νπνίν αθπξώλεη νπνηεζδήπνηε αλαθνξέο ζην column_name (constraints, views, θηι) πξνηνύ γίλεη ε δηαγξαθή. Η ALTER έτει πολλές επιλογές, π.τ.,: ALTER TABLE tname ALTER COLUMN cname DROP DEFAULT; ALTER TABLE tname ALTER COLUMN cname SET DEFAULT 1; Γηα ηελ πιήξε ζύληαμε ηεο ALTER ζε TSQL http://msdn.microsoft.com/en-us/library/ms190273.aspx 13-20
Δπηπιένλ Πεξηνξηζκνί ζηελ SQL Σε απηή ηελ ελόηεηα ζα κειεηήζνπκε ηνπο πεξηνξηζκνύο πνπ κπνξνύκε λα δηαηππώζνπκε κε ηελ SQL-DDL. Θα θάλνπκε ηδηαίηεξε αλαθνξά ζηνπο πεξηνξηζκνύο ζηα πιαίζηα ηεο TSQL-DDL (SQL Server 2008). Πέξα από ηνπο πεξηνξηζκνύο πνπ είδακε ήδε NULL/NOT NULL, PRIMARY KEY, UNIQUE θαη FOREIGN KEY ζα κειεηήζνπκε θαη ηα αθόινπζα: Ολνκαζία Πεξηνξηζκώλ (Naming) Πεξηνξηζκνί DEFAULT Πεξηνξηζκνί CHECK Εληνιέο Ελεξγνπνίεζεο Αλαθνξάο ON DELETE ON UPDATE { NO ACTION CASCADE SET NULL SET DEFAULT } Πξνζωξηλή Απελεξγνπνίεζε Πεξηνξηζκώλ WITH CHECK / WITH NO CHECK 13-21
Πεξηνξηζκνί ζηελ SQL (Ολνκαζία Πεξηνξηζκώλ) Σηα πξνεγνύκελα παξαδείγκαηα δελ δώζακε θάπνηα νλόκαηα ζηνπο πεξηνξηζκνύο,π.ρ., Απηό πνπ γίλεηαη είλαη όηη ε DBMS θηηάρλεη ηα δηθά ηεο νλόκαηα (π.ρ., PK_Department_22AE2995) γηα λα αλαπαξαζηαζεί ην PRIMARY KEY(Dnumber). To όλνκα ζα ρξεηαζηεί εάλ ζέινπκε λα αιιάμνπκε έλα πεξηνξηζκό αξγόηεξα κε ηελ ρξήζε ηεο εληνιήο ALTER. CREATE TABLE DEPARTMENT ( Dnumber INT NOT NULL,. CONSTRAINT PKDnumber PRIMARY KEY(Dnumber) ) 13-22
Πεξηνξηζκνί ζηελ SQL (Πεξηνξηζκόο DEFAULT) DEFAULT <value>: Οξίδεη έλα value γηα έλα γλώξηζκα δεδνκέλνπ όηη απηό δελ νξίδεηαη ξεηά θαηά ηελ εηζαγωγή κηαο πιεηάδαο ζε κηα ζρέζε. Παξάδεηγκα: CREATE TABLE LIBRARIAN /* or Micro_db.LIBRARIAN */ ( Name nvarchar(50) NOT NULL, SSN int NOT NULL PRIMARY KEY, startdate DATE NOT NULL DEFAULT GETDATE(), Salary DEC(8,2) DEFAULT 0.0 ); Πιεξνθνξίεο γηα TSQL To value κπνξεί λα είλαη NULL ή String ή scalar value Τν DEFAULT δελ εθαξκόδεηαη πάλω ζε IDENTITY, TIMESTAMP 13-23
Πεξηνξηζκνί ζηελ SQL (Πεξηνξηζκόο CHECK) CHECK (logical expression): Πεξηνξηζκόο πνπ επηβάιεη ηελ αθεξαηόηεηα νληόηεηαο πεξηνξίδνληαο ηηο δπλαηέο ηηκέο ελόο γλωξίζκαηνο βάζεη ινγηθήο ζπλζήθεο. Η ζπλζήθε εθαξκόδεηαη ζε θάζε αιιαγή (insert, update) ΓΔΝ επηηξέπεηαη αλαθνξά ζε άιιν πίλαθα κέζω ηεο CHECK Παξάδεηγκα: CREATE TABLE LIBRARIAN ( /* or Micro_db.LIBRARIAN */ Name nvarchar(50) NOT NULL, SSN int NOT NULL PRIMARY KEY, Salary DEC(8,2) DEFAULT 0.0 CHECK(Salary >= 0) ); Πιεξνθνξίεο γηα TSQL Γελ κπνξεί λα νξηζηεί γηα text, ntext, or image. Σεκεηώζηε όηη απηνί νη ηύπνη είλαη επίζεο deprecated. Γηα απηό κπνξεί λα νξηζηνύλ ωο varchar(max), nvarchar(max) θαη varbinary(max) αληίζηνηρα. 13-24
Πεξηνξηζκνί ζηελ SQL (Πεξηνξηζκόο CHECK) Παξαδείγκαηα Λεηηνπξγηώλ ηεο CHECK ζε TSQL Λεηηνπξγία Σύληαμε ζε TSQL Εμεηδίθεπζε Πεδίνπ Οξηζκνύ Month BETWEEN 1 and 12 Εμεηδίθεπζε Πεδίνπ Οξηζκνύ Shippers IN ( Ups, Fed Ex, USPS ) ύγθξηζε Πεδίνπ κε ηαζεξά Price >= 0 ύγθξηζε Πεδίωλ DeliveryDate >= OrderDate ύγθξηζε Πεδίνπ κε πλάξηεζε StartDate <= GETDATE ( ) Έιεγρνο Μνξθήο (e.g., 111-11-1111) [ ] : Οποιοζδήποηε ταρακηήρας μέζα ζε προζδιοριζμένο εύρος (π.τ. [a-f]) ή ζύνολο ([abcdef]). Έιεγρνο Μνξθήο % : 0 ή περιζζόηεροι ταρακηήρες _ : 1 οποιοζδήποηε ταρακηήρας. SSN LIKE [0-9] [0-9] [0-9] -[0-9] [0-9] [0-9] [0-9] [0-9] [0-9] email LIKE %@cs.ucy.ac.cy %@%.cy * To LIKE ζα κειεηεζεί εθηελεζηέξα ζηα πιαίζηα ηεο SQL-DML 13-25
Πεξηνξηζκνί ζηελ SQL (Εληνιέο Ελεξγνπνίεζεο Αλαθνξάο) Οη CHECK, NOT NULL, DEFAULT είλαη πεξηνξηζκνί πνπ ρξεζηκνπνηνύληαη ζην επίπεδν ελόο γλωξίζκαηνο ή κηαο ζρέζεο. Η FOREIGN KEY από ηελ άιιε αλαθέξεηαη ζε πεξηνξηζκνύο κεηαμύ δπν ζρέζεωλ. π.ρ., Π.ρ., FOREIGN KEY (MGRSSN) REFERENCES EMP(SSN) Δάλ παξαβηαζηεί ν αλαθνξηθόο πεξηνξηζκόο ηόηε ε βάζε απνξξίπηεη ηελ πξάμε (REJECT) Π.ρ., δελ κπνξνύκε λα ζβήζνπκε ηνλ Manager θάπνηνπ ππαιιήινπ ζηελ βάζε. Γηα λα εμεηδηθεύζνπκε ηελ αληίδξαζε ηεο βάζεο ζε ηέηνηεο ηξνπνπνηήζεηο ρξεζηκνπνηνύληαη θάπνηεο επηπιένλ εληνιέο ζηελ δήιωζε ελόο πίλαθα. Γεο επόκελε δηαθάλεηα 13-26
Πεξηνξηζκνί ζηελ SQL (Εληνιέο Ελεξγνπνίεζεο Αλαθνξάο) Οη Εληνιέο Ελεξγνπνίεζεο Αλαθνξάο δειώλνπλ ηι θα γίνει ζηο FK (Foreign Key) μιας ζτέζης από αλλαγή ζηο PK (Primary Key) αναθερόμενης ζτέζης. Δλεξγνπνηνύληαη αλ παξαβηαζηεί έλαο αλαθνξηθόο πεξηνξηζκόο θαηά ην ON DELETE ή ON UPDATE Employee(Ssn, Ename, Dno) Department(Dno, Dname) Λεηηνπξγίεο: FK PK NO ΑCTION: Απαγνξεύεη ηελ Αιιαγή (Default). Γηαηί λα νξίδεηαη; Γηα λα μεθαζαξίζεη ηελ πξόζεζε ηνπ ζρεδηαζηή SET NULL: Θέηεη ην FK=NULL. Πξνϋπνζέηεη όηη ε ζηήιε FK κπνξεί λα είλαη NULLABLE. SET DEFAULT: Θέηεη ην FK=DEFAULT. Πξνϋπνζέηεη όηη ην Default έρεη νξηζηεί γηα ην FK. CASCADE: Δηάδνζε Αιιαγήο ON DELETE CASCADE: Γηαγξάθεη ηελ πιεηάδα ηνπ FK ON EPL342: UPDATE Databases CASCADE: - Demetris Zeinalipour Δλεκεξώλεη (University ην FK of Cyprus) κε ην λέν PK 13-27
Πεξηνξηζκνί ζηελ SQL (Εληνιέο Ελεξγνπνίεζεο Αλαθνξάο) Δάλ ζβεζηεί ν Supervisor ηνπ ππαιιεινπ Φ ηόηε Φ.Super_ssn=NULL Δάλ αιιάμεη SSN ν Supervisor ηνπ ππαιιεινπ Φ ηόηε Φ.Super_ssn=NewSSN 13-28
Πεξηνξηζκνί ζηελ SQL (Εληνιέο Ελεξγνπνίεζεο Αλαθνξάο) Οη Δληνιέο Δλεξγνπνίεζεο Αλαθνξάο, εηδηθόηεξα ην ON DELETE CASCADE, ρξεηάδνληαη κεγάιε πξνζνρή δηόηη ε ελέξγεηα δύλαηαη λα πξνθαιέζεη αιπζίδωηεο αιιαγέο (Chaining) πνπ κπνξεί λα ζβήζεη νιόθιεξν πίλαθα! Π.ρ., Θεωξήζηε ηελ δήιωζε CREATE TABLE Employee ( SSN int NOT NULL PRIMARY KEY, PK FK Employee(Ssn, MgrSSN) MgrSSN int, FOREIGN KEY(MgrSSN) REFERENCES Employee(SSN) ON DELETE CASCADE) Καη ην ζηηγκηόηππν Εmployee = {(1,1), (2,1), (3,2), (4,3)} Σβήλνληαο ηνλ Employee.SSN=1 ζα πξνθαινύζε δηαγξαθή όιωλ ηωλ εγγξαθώλ ηνπ πίλαθα! Γηα απηό ν SQL Server δελ επηηξέπεη ηελ πην πάλω εληνιή CREATE TABLE επηζηξέθνληαο ην κήλπκα ιάζνπο Introducing FOREIGN KEY constraint 'FK Employee SSN 1CF15040' on table 'Employee' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. 13-29
Πεξηνξηζκνί ζηελ SQL (Πξνζωξηλή Απελεξγνπνίεζε Πεξηνξηζκώλ) Γλωξίδνπκε όηη ε βάζε δεδνκέλωλ είλαη ζπλερώο ζε κηα ζπλεπή (consistent) θαηάζηαζε. Γειαδή όινη νη πεξηνξηζκνί (θιεηδηνύ, αλαθνξηθήο αθεξαηόηεηαο, θηι) ηεξνύληαη κε αθξίβεηα. Κάπνηε επηζπκνύκε λα απελεξγνπνηήζνπκε πξνζωξηλά θάπνηνπο πεξηνξηζκνύο, π.ρ., εηξά Εηζαγωγήο Δεδνκέλωλ: εάλ θνξηώζνπκε πξώηα ηνπο Employee κεηά ηα Departments δελ ζέινπκε λα καο δίλεη κελύκαηα ιάζνπο (ιόγω foreign key constraint) Εηζαγωγή Παιηώλ Δεδνκέλωλ, ζέινπκε λα θνξηώζνπκε θάπνηα ΠΑΛΙΑ δεδνκέλα πνπ δελ αθνινπζνύλ θάπνην πεξηνξηζκό (π.ρ., κνξθνπνίεζε). Μπνξνύκε λα ηα θνξηώζνπκε θαη κεηά λα ελεξγνπνηήζνπκε ηνλ πεξηνξηζκό γηα ηα λέα δεδνκέλα. ΔΕΝ ΤΝΙΣΑΣΑΙ ΣΟ ΕΝΑΡΙΟ 2 ΩΣΟΟ (ΑΤΝΕΠΕΙΑ) 13-30
Πεξηνξηζκνί ζηελ SQL (Πξνζωξηλή Απελεξγνπνίεζε Πεξηνξηζκώλ) WITH CHECK WITH NOCHECK: Γειώλεη θαηά πόζν ηα δεδνκέλα ελόο πίλαθα ζα επηθπξωζνύλ (validated) ή όρη έλαληη θάπνηνπ πεξηνξηζκνύ (π.ρ., πεξηνξηζκό FOREIGN KEY ή CHECK) Επηζεκάλζεηο Οη πεξηνξηζκνί πξέπεη λα απελεξγνπνηνύληαη ΠΡΟΩΡΙΝΑ. Δελ κπνξνύκε λα απελεξγνπνηήζνπκε ην PRIMARY KEY θαη UNIQUE Ελεξγνπνίεζε/Απελεξγνπνίεζε ζα γίλεη κε ρξήζε ηεο εληνιήο ALTER. Παξαδείγκαηα Ελεξγ./Απελεξγ. Τθηζηάκελνπ Πεξηνξηζκνύ: ALTER TABLE Employee CHECK ΝΟCHECK CONSTRAINT fk_something Εηζαγωγή Νένπ Πεξηνξηζκνύ FK (ρωξίο έιεγρν παιηώλ data): : ALTER TABLE Employee WITH NOCHECK ADD CONSTRAINT FK_Employee FOREIGN KEY(SSN) REFERENCES Employee(SSN) Εηζαγωγή Νένπ Πεξηνξηζκνύ CHECK (ρωξίο έιεγρν παιηώλ data): ALTER TABLE Employee WITH NOCHECK WITH CHECK είλαη default γηα λένπο πεξηνξηζκνύο ADD CONSTRAINT CN_SSNFormat CHECK (SSN LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9] ) 13-31