basi di dati (2)bulgarelli/ab/basi_di_dati_files/2.pdfcreate table employee ( emp_id int not null...

30
Andrea Bulgarelli 1 Basi di dati (2) Docente: Andrea Bulgarelli [email protected] Argomento: tabelle (1.0) Università di Modena e Reggio Emilia

Upload: phungcong

Post on 31-Mar-2018

221 views

Category:

Documents


2 download

TRANSCRIPT

Andrea Bulgarelli 1

Basi di dati (2)

Docente: Andrea Bulgarelli [email protected] Argomento: tabelle (1.0)

Università di Modena e Reggio Emilia

2 Andrea Bulgarelli

Panoramica

 Tabelle  Creazione  Modifica  Cancellazione

 Esempio Clienti/Ordini: creazione tabelle (create e alter table)

 Tabelle temporanee e di sistema

3 Andrea Bulgarelli

Creazione di tabelle

  In SQL server si possono creare tabelle sia con Enterprise Manager che con Query Analyser

database.owner.tablename

4 Andrea Bulgarelli

Descrizione del comando create table (1) CREATE TABLE

[ database_name.[owner]. | owner. ] table_name ( {

<column_definition> | column_name AS computed_column_expression | <table_constraint> } [,...n] ) [ON {filegroup | DEFAULT} ] [TEXTIMAGE_ON {filegroup | DEFAULT} ]

5 Andrea Bulgarelli

Descrizione del comando create table (2) <table_constraint> ::= [CONSTRAINT constraint_name]

{ [ { PRIMARY KEY | UNIQUE } [ CLUSTERED | NONCLUSTERED] { ( column[,...n] ) } [ WITH FILLFACTOR = fillfactor] [ON {filegroup | DEFAULT} ] ] | FOREIGN KEY [ ( column[,...n] ) ] REFERENCES ref_table

[ ( ref_column[,...n] ) ] [NOT FOR REPLICATION] | CHECK [NOT FOR REPLICATION] ( search_conditions ) }

6 Andrea Bulgarelli

Descrizione del comando create table (3) <column_definition> ::= { column_name data_type }

[ [ DEFAULT constant_expression ] | [ IDENTITY [(seed, increment ) [NOT FOR REPLICATION] ] ] ] [ ROWGUIDCOL ] [ <column_constraint> ] [ ...n]

<column_constraint> ::= [CONSTRAINT constraint_name] { [ NULL | NOT NULL ] | [ { PRIMARY KEY | UNIQUE } [CLUSTERED | NONCLUSTERED] [WITH FILLFACTOR = fillfactor] [ON {filegroup | DEFAULT} ]] ] | [ [FOREIGN KEY] REFERENCES ref_table [(ref_column) ] [NOT FOR REPLICATION] ] | CHECK [NOT FOR REPLICATION] (logical_expression) }

7 Andrea Bulgarelli

Denominazione   Si usano un massimo di 128 lettere, caratteri numerici, o

simboli (#, $, @, _)   definire una regola generale per la denominazione degli

oggetti (tabelle, attributi, procedure, etc) è una buona cosa

  Attenzione alle parole riservate (select, create, update, ed in genere i termini in SQL92)

  Gli identificatori possono essere delimitati

8 Andrea Bulgarelli

Tipi di dati   Cinque gruppi di tipi di dato

  Numerici   bigint, int, smallint, money, smallmoney, float, real

  Caratteri   Char, varchar, nchar, nvarchar (Unicode)

  Tempi (data e ora)   datetime, smalldatetime

  BLOB (large object)   Vari

  binary, bit, rowversion (era timestamp), table, uniqueidentifier

  Il tipo sql_variant può assumere connotazioni diverse a tempo di esecuzione

  C’è un tipico trade-off tra tipi di dimensioni costanti e tipi di dimensione variabile

9 Andrea Bulgarelli

Synonym Mapped to syst datatype binary varying varbinary char varying varchar character char(1) character(n) char(n) character varying(n) varchar(n) dec decimal double precision float float[(n)] for n = 1 to 7 real float[(n)] for n = 8 to 15 float integer int national character(n) nchar(n) national char(n) nchar(n) national character varying(n) nvarchar(n) national char varying(n) nvarchar(n) national text ntext numeric decimal

10 Andrea Bulgarelli

11 Andrea Bulgarelli

12 Andrea Bulgarelli

I problemi dei valori NULL

  Il valore NULL indica assenza di informazione   Permettere la presenza di valori NULL comporta

un onere maggiore per il DBMS, in particolare il motore di archiviazione e le applicazioni

  Se possibile il DBMS non gestisce il NULL; è tipico usare colonne NOT NULL, assegnando valori predefiniti per classificare le voci mancanti o sconosciute

  L’importante però è che il modello logico sia rispettato

13 Andrea Bulgarelli

Tipi di dati definiti dagli utenti  Si possono definire tipi di dato derivati per

garantire un uso coerente dei tipi nativi all’interno del DB e della applicazione

14 Andrea Bulgarelli

La proprietà IDENTITY

  Le tabelle che non hanno una chiave primaria naturale vengono in genere dotate di un elemento di tipo contatore

  Sintassi: IDENTITY [ (val_iniziale,incremento) ]   Esempio:

CREATE TABLE customer ( cust_id integer IDENTITY NOT NULL, cust_name varchar(50) NOT NULL )

15 Andrea Bulgarelli

La proprietà IDENTITY (2)

  Tipicamente accade che i valori inseriti nel campo IDENTITY non siano consecutivi

  Esempio tipico: più transazioni avviate, con qualcuna in seguito non completata

  Altro esempio: cancellazione dei record   Si può controllare l’ultimo valore assegnato per

una tabella:

SELECT IDENT_CURRENT('customer')

16 Andrea Bulgarelli

Vincoli   I vincoli contribuiscono a mantenere nel sistema l’integrità dei dati e

delle relazioni tra loro   Ad un vincolo può essere dato un nome con CONSTRAINT   Integrità di tabella (primo vincolo di integrità): esistenza di una

PRIMARY KEY o UNIQUE, a cui corrisponde la creazione di indici. Un indice è una struttura all’interno del database che consente un accesso rapido ai dati. Di solito il database costruisce sempre un indice associato alla primary key

  Integrità di dominio: i dati soddisfano a condizioni specifiche (e.g. di formato, di appartenenza ad un insieme predefinito); cfr. CHECK

  Valori di default: Crea un oggetto definito valore predefinito: se non viene specificato nulla, viene inserito nella colonna il valore specificato dal vincolo. Vedi DEFAULT

  Integrità referenziale (secondo vincolo di integrità): relazioni tra dati in tabelle distinte; cfr. FOREIGN KEY

17 Andrea Bulgarelli

Vincolo PRIMARY KEY   Nel modello relazionale ogni riga di una tabella è unica e

distinguibile da tutte le altre   Più attributi possono essere identificatori unici degli

elementi in una tabella, ma la PRIMARY KEY deve essere unica (gli altri sono ALTERNATE o CANDIDATE KEYS)

  È raccomandato (ma non obbligatorio) definire una PRIMARY KEY in ogni tabella

  Viene creato per default un indice CLUSTERED

CREATE TABLE customer ( cust_id int PRIMARY KEY, cust_name varchar(30) NOT NULL )

CREATE TABLE customer ( cust_id int, cust_name varchar(30) NOT NULL,

CONSTRAINT PK_customer PRIMARY KEY(cust_id) )

Un indice cluster determina l'ordinamento fisico dei dati in una tabella. Un indice cluster ha un funzionamento analogo a quello di un elenco telefonico che dispone i dati per cognome. Poiché l'indice cluster stabilisce l'ordine di archiviazione fisico dei dati nella tabella, una tabella può includere un unico indice cluster. Tuttavia, l'indice può includere più colonne (un indice composto), così come l'elenco telefonico è organizzato per cognome e nome.

Un indice cluster è particolarmente efficiente in colonne in cui vengono eseguite ricerche di intervalli di valori.

18 Andrea Bulgarelli

Vincolo UNIQUE

 Viene creato per default un indice UNCLUSTERED

CREATE TABLE customer_location (

cust_id int NOT NULL, cust_location_number int NOT NULL,

CONSTRAINT UNQ_customer_location UNIQUE (cust_id, cust_location_number)

)

19 Andrea Bulgarelli

Vincolo FOREIGN KEY CREATE TABLE customer ( cust_id int NOT NULL IDENTITY PRIMARY KEY,

cust_name varchar(50) NOT NULL )

CREATE TABLE orders ( order_id int NOT NULL IDENTITY PRIMARY KEY,

cust_id int NOT NULL REFERENCES customer(cust_id) )

20 Andrea Bulgarelli

CREATE TABLE customer

(

cust_id int NOT NULL,

location_num smallint NULL,

cust_name varchar(50) NOT NULL,

CONSTRAINT UNQ_customer UNIQUE (location_num, cust_id)

)

CREATE TABLE orders

(

order_id int NOT NULL IDENTITY CONSTRAINT ORDER_PK

PRIMARY KEY NONCLUSTERED,

cust_num int NOT NULL,

cust_loc smallint NULL,

CONSTRAINT FK_ORDER_CUSTOMER FOREIGN KEY (cust_loc, cust_num)

REFERENCES customer (location_num, cust_id)

)

21 Andrea Bulgarelli

Vincolo CHECK CREATE TABLE employee ( emp_id int NOT NULL PRIMARY KEY CHECK (emp_id BETWEEN 0 AND 1000), emp_name varchar(30) NOT NULL CONSTRAINT no_nums CHECK (emp_name NOT LIKE '%[0-9]%'), mgr_id int NOT NULL

REFERENCES employee(emp_id), in_date datetime NOT NULL

CHECK (in_date >= CURRENT_TIMESTAMP) )

Per aggiungere aggiornamenti o cancellazioni in cascata aggiungere on update cascade on delete cascade. Esempio:

REFERENCES employee(emp_id) on update cascade

EXEC sp_helpconstraint employee

22 Andrea Bulgarelli

Modifica di una tabella   Le modifiche alla struttura di una tabella (ins/mod/canc di

una colonna; ins/mod/canc di un vincolo; attiv/disattiv di un vincolo) si applicano utilizzando il comando ALTER TABLE

  Non tutte le modifiche sono lecite (lista completa in SQLBOL):   Se una colonna è ROWGUIDCOL, se ne può solo fare DROP   La colonna non può essere di alcuni tipi (eg text)   Non può essere una colonna replicata o calcolata   Non può avere un vincolo di PRIMARY o FOREIGN KEY   Il tipo non può divenire timestamp

23 Andrea Bulgarelli

ALTER TABLE ALTER TABLE table { [ ALTER COLUMN column_name

{ new_data_type [ ( precision[, scale] ) ] [ NULL | NOT NULL ] | {ADD | DROP} ROWGUIDCOL } ] | ADD { [ <column_definition> ] | column_name AS computed_column_expression }[,...n] | [WITH CHECK | WITH NOCHECK] ADD { <table_constraint> }[,...n] | DROP { [CONSTRAINT] constraint_name | COLUMN column }[,...n] | {CHECK | NOCHECK} CONSTRAINT {ALL | constraint_name[,...n]} | {ENABLE | DISABLE} TRIGGER {ALL | trigger_name[,...n]}

}

24 Andrea Bulgarelli

Esempio: Mxx_Ordini

25 Andrea Bulgarelli

CREATE TABLE [dbo].[CLIENTE] (

[CF] [char] (16) NOT NULL ,

[Nome] [varchar] (50) NULL ,

[Cognome] [varchar] (50) NULL ,

[Indirizzo] [varchar] (100) NULL

) ON [PRIMARY]

GO

CREATE TABLE [dbo].[ORDINE] (

[Numero] [int] NOT NULL ,

[Anno] [smallint] NOT NULL ,

[Data] [smalldatetime] NOT NULL ,

[CF] [char] (16) NOT NULL ,

[id] [int] IDENTITY (1, 1) NOT NULL

) ON [PRIMARY]

GO

CREATE TABLE [dbo].[PRODOTTO] (

[Codice] [char] (6) NOT NULL ,

[Descrizione] [varchar] (200) NOT NULL ,

[Quantita_Magazzino] [int] NOT NULL

) ON [PRIMARY]

GO

CREATE TABLE [dbo].[PRODOTTO_ORDINE] (

[Codice_Prodotto] [char] (6) NOT NULL ,

[Numero_Ordine] [int] NOT NULL ,

[Anno] [smallint] NOT NULL ,

[Quantita] [int] NOT NULL

) ON [PRIMARY]

GO

ON PRIMARY significa che la tabella viene salvata nel file primario del database.

26 Andrea Bulgarelli

ALTER TABLE [dbo].[CLIENTE] WITH NOCHECK ADD

CONSTRAINT [PK_CLIENTE] PRIMARY KEY NONCLUSTERED

(

[CF]

) ON [PRIMARY] ,

CONSTRAINT [CK_CLIENTE] CHECK (([CF] like '[A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][0-9][0-9][A-Z][0-9][0-9][A-Z][0-9][0-9][0-9][A-Z]'))

GO

  WITH NOCHECK: non applicare il vincolo ai dati esistenti

27 Andrea Bulgarelli

ALTER TABLE [dbo].[ORDINE] WITH NOCHECK ADD

CONSTRAINT [PK_ORDINE] PRIMARY KEY NONCLUSTERED

(

[Numero],

[Anno]

) ON [PRIMARY] ,

CONSTRAINT [AK_ORDINE] UNIQUE NONCLUSTERED

(

[id]

) ON [PRIMARY] ,

CONSTRAINT [CK_ORDINE] CHECK ([numero] > 0),

CONSTRAINT [CK_ORDINE_1] CHECK (datepart(year,[data]) = [anno]),

CONSTRAINT [CK_ORDINE_2] CHECK ([Anno] > 1990 and [anno] < 2050)

GO

28 Andrea Bulgarelli

ALTER TABLE [dbo].[PRODOTTO] WITH NOCHECK ADD

CONSTRAINT [DF_PRODOTTO_Quantita_Magazzino] DEFAULT (0) FOR [Quantita_Magazzino],

CONSTRAINT [PK_PRODOTTO] PRIMARY KEY NONCLUSTERED

(

[Codice]

) ON [PRIMARY] ,

CONSTRAINT [CK_PRODOTTO] CHECK ([quantita_magazzino] >= 0)

GO

ALTER TABLE [dbo].[PRODOTTO_ORDINE] WITH NOCHECK ADD

CONSTRAINT [DF_PRODOTTO_ORDINE_Quantita] DEFAULT (0) FOR [Quantita],

CONSTRAINT [PK_PRODOTTO_ORDINE] PRIMARY KEY NONCLUSTERED

(

[Codice_Prodotto],

[Numero_Ordine],

[Anno]

) ON [PRIMARY] ,

CONSTRAINT [CK_PRODOTTO_ORDINE] CHECK ([quantita] >= 0)

GO

29 Andrea Bulgarelli

ALTER TABLE [dbo].[ORDINE] ADD

CONSTRAINT [FK_ORDINE_CLIENTE] FOREIGN KEY

(

[CF]

) REFERENCES [dbo].[CLIENTE] (

[CF]

)

GO

ALTER TABLE [dbo].[PRODOTTO_ORDINE] ADD

CONSTRAINT [FK_PRODOTTO_ORDINE_ORDINE] FOREIGN KEY

(

[Numero_Ordine],

[Anno]

) REFERENCES [dbo].[ORDINE] (

[Numero],

[Anno]

),

CONSTRAINT [FK_PRODOTTO_ORDINE_PRODOTTO] FOREIGN KEY

(

[Codice_Prodotto]

) REFERENCES [dbo].[PRODOTTO] (

[Codice]

)

GO

30 Andrea Bulgarelli

Eliminazione di una tabella o di un constraint   L’eliminazione della tabella comprende la

rimozione di tutti i dati, le definizioni, gli indici, i trigger, i permessi specifici per la tabella

  Sintassi: DROP TABLE nome-tabella

  Eliminazione di un constraint ALTER TABLE nometabella DROP CONSTRAINT nome-constraint