venerdì, settembre 19, 2008

Basi di dati: SQL: DDL

Domini Elementari:

TIPI NUMERICI:

Esatti: integer, smallint, numeric, decimal (virgola fissa)
Approssimati (virgola mobile): real, double precision, float

STRINGA:

char (numero fisso di caratteri), varchar (numero variabile di caratteri). Si può associare la lunghezza massima

Bit: strighe composte di 0 o 1
Boolean: memorizza true o false

DATE:

Date: Data (passata in formato yyyyMMdd
Time: Ora, passata in formato hh:mm:ss
Timestamp: Date + Time

OGGETTI GRANDI:

Blob, Clob


 

TRE FAMIGLIE DI COMANDI: CREATE (creazione), DROP (cancellazione), ALTER (modifica)

CREATE

CREATE SCHEMA (implementato spesso come CREATE DATABASE)

CREATESCHEMA NomeSchema AUTHORIZATION Owner {ElementoSchema}

CREATE TABLE

CREATE TABLE
NomeTabella (
NomeAttributo
Dominio [DEFAULT
ValoreDefault] [Vincoli],
NomeAttributo
Dominio [DEFAULT
ValoreDefault] [Vincoli],
…)

Dominio può essere composto anche da tipo(dimensione). Es.: char(20).

Vincoli:
UNIQUE: Non possono esserci duplicati (ma potrebbero esserci nulli)
NOT NULL: Valori nulli non ammessi
PRIMARY KEY: Se metto questo vincolo su più campi faranno tutti parte dell'unica primary key

Per mettere un vincolo su un maggior numero di attributi posso metterli alla fine (es. primary con 2 campi):
CREATE TABLE
MyTable (campo1 tipo1, campo2 tipo2,
PRIMARY KEY (campo1, campo2))

VINCOLI DI INTEGRITÀ (INTRA-RELAZIONALI)

Posso applicare un vincolo "custom" mettendo dopo l'elenco dei campi (come per primary key qui sopra):
[CONSTRAINT
ConstraintName] CHECK condizione
Es: CONSTRAINT MioVincolo CHECK campo IN ('value1', 'value2')
Es2: CONSTRAINT MioVincolo2 CHECK campo2 > 10

I vincoli CONSTRAINT sono rigorosamente INTRArelazionali. Se si desidera specificare un vincolo CHECK interrelazionale è necessario creare un ASSERTION (vedi più avanti). Per quanto ne so io le ASSERTION comunque non sono supportate dalla maggior parte dei motori relazionali, al massimo creare un trigger.

E' possibile specificare altri vincoli mediante CONSTRAINT, come ad esempio il vincolo UNIQUE.
Nell'esempio seguente non sono Campo1 e Campo2 a dover essere UNIQUE, ma la loro combinazione:
[CONSTRAINT
MyConstraint] UNIQUE (Campo1, Campo2)

Perché specificare la parte opzionale "CONSTRAINT
ConstraintName"? Perché successivamente sarà possibile fare un ALTER o un DROP riferendosi a tale nome.

VINCOLI INTER-RELAZIONALI

FOREIGN KEY: Integrità referenziale

Definito tra due tabelle: tabella che riferisce (es.Indirizzo, con IDPersona) e riferita (es. Persona con campo ID)
La tabella riferita dovrebbe avere sui propri attributi il vincolo UNIQUE

[CONSTRAINT
ConstraintName] [FOREIGN KEY
MioCampo] REFERENCES altroCampo(altraTabella))
Se lo appongo dopo la dichiarazione di un campo basta REFERENCES (es: mioCampo mioTipo REFERENCES altroCampo(altraTabella))
Se la chiave è multi-valore sono costretto a metterlo alla fine della tabella: FOREIGN KEY (campi) REFERENCES tabella (altricampi)

Posso specificare delle azioni tipo:
REFERENCES altroCampo(altraTabella) [ON DELETE/UPDATE] CASCADE/SET NULL/SET DEFAULT/NO ACTION

ON DELETE: alla cancellazione del record nella tabella principale cancello anche i record riferiti
ON UPDATE: all'aggiornamento del campo primary key della tabella riferita
    CASCADE: Il cambio della chiave primaria cambia anche le chiavi esterne (o cancello)
    SET NULL: Se cancello o cambio imposta a NULL le foreign keys
    SET DEFAULT: Imposto le foreign key al valore di default
    NO ACTION: (default) Rifiuto il cambiamento/cancellazione

La parte ON DELETE/UPDATE è opzionale: se tralasciata si intendono entrambe.

CREATE ASSERTION

Del tutti analogo a mettere un CONSTRAINT all'interno di una CREATE TABLE, ma con la possibilità di specificare vincoli inter-relazionali:
CREATE ASSERTION
AssertionName
Es: CREATE ASSERTION
MyAssertion
CHECK
Tab1.Campo1 > SELECT MAX(Campo2) FROM Tab2

CREATE DOMAIN

Permette di creare un dominio partendo da uno esistente
CREATE DOMAIN
NewDomainName
AS
tipoBase [DEFAULT
valore1] [CHECK (condizione)]

Potrei creare un dominio intero compreso tra 10 e 100 con valore di default 20:
CREATE DOMAIN
MyDomain
AS int DEFAULT
20
CHECK (VALUE >= 10 AND VALUE <= 100)

ALTER

ALTER TABLE
MyTable
ALTER COLUMN MyColumn
CAMBIAMENTO

Esempi di possibili cambiamenti:
tipo di dati di una colonna ALTER TABLE
MyTable
ALTER COLUMN MyColumn NewType
default di una colonna ALTER TABLE
MyTable
ALTER COLUMN MyColumn
SET DEFAULT
NuovoDefault
eliminazione valore di default: ALTER TABLE
MyTable
ALTER COLUMN MyColumn
DROP DEFAULT
aggiunta/rimozione di una colonna: … ADD/DROP COLUMN ColumnName (se ADD specificare tipo, eventuali vincoli, ecc.)
aggiunta/rimozione di un vincolo (CON NOME!) ADD/DROP CONSTRANT
ConstraintName (se ADD definizone del vincolo)

DROP

DROP SCHEMA (DROP DATABASE) DatabaseName
DROP TABLE
TableName
DROP DOMAIN
DomainName
DROP VIEW
ViewName
DROP ASSERTION
AssertionName
DROP CONSTRAINT
AssertionName

Con opzioni:
RESTRICT (default): Se ci sono oggetti che ne dipendono (es una vista sulla tabella che voglio cancellare) NON li cancella
CASCADE: Cancella gli oggetti che ne dipendono

CATALOG

Le informazioni sugli oggetti di un database vengono raccolte all'interno di una BD relazionale detta CATALOG (riflessività)
Maggiori informazione con la definizione di trigger e viste

Nessun commento: