Salta el contingut
 

DDL - Llenguatge de Definici贸 de Dades

Joan Puigcerver Ib谩帽ez

j.puigcerveribanez@edu.gva.es

Llic猫ncia: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 馃叚

Introducci贸露

Una vegada hem dissenyat i modelat, de manera te貌rica, l'estructura de la base de dades relacional, el que cal fer 茅s definir aquest model en el Sistema Gestor de Bases de Dades.

DBMS

Cada SGBD t茅 la seua manera de definir aquest model. No obstant aix貌, en els SGBD relacionals, normalment s'utilitza SQL per comunicar-nos i interactuar amb aquest.

SQL露

SQL (Structured Query Language) 茅s un llenguatge que permet gestionar i recuperar les dades emmagatzemades en una base de dades relacional.

Algunes de les caracter铆stiques s贸n:

  • Permet la comunicaci贸 amb el SGBD. Cada SGBD t茅 el seu propi llenguatge.
  • 脡s un llenguatge que pot ser utilitzar per diferents perfils d'usuaris: Administradors i Programadors.
  • 脡s un llenguatge declaratiu. S'especifica el resultat que es vol obtindre, no el com.

Depenent de l'objectiu de les sent猫ncies SQL, es poden classificar en els seg眉ents subllenguatges:

  • Llenguatge DDL: llenguatge de definici贸 de dades (Data Definition Language). Permet crear tota l'estructura d'una base de dades, les relacions entre les dades i les regles que han de complir. Les operacions s贸n de tipus DROP (esborrar), ALTER (modificar) i CREATE (crear).

  • Llenguatge DML: llenguatge de manipulaci贸 de dades (Data Manipulation Language). Aquest llenguatge permet: SELECT (seleccionar/buscar), INSERT (inserir), UPDATE (actualitzar) i DELETE (esborrar).

  • Llenguatge DCL: llenguatge de control de dades (Data Control Language). Inclou comandes com GRANT i REVOKE que permeten a l'administrador gestionar l'acc茅s a les dades contingudes en la base de dades.

  • Llenguatge TCL: llenguatge de control de transaccions (Transaction Control Language). El prop貌sit d'aquest llenguatge 茅s permetre executar varies comandes de forma simult脿nia com si foren una comanda at貌mica o indivisible. Si 茅s possible, s'aplica la transacci贸 (COMMIT), i si, en algun pas de l'execuci贸 passa quelcom inesperat, es poden desfer tots els passos realitzats (ROLLBACK).

  • Llenguatge de procediments: Permet la creaci贸 de funcions, procediments, rutines i disparadors ens bases de dades SQL. En les bases de dades SQL d'Oracle rep el nom de PL/SQL (Procedural Language for SQL), afegeix una extensi贸 per sobre de SQL. No existeix un est脿ndard.

En aquest material, ens centrarem en el subllenguatge DDL.

DDL露

El llenguatge DDL significa Llenguatge de Definici贸 de Dades (Data Definition Language). Aquest subllenguatge de SQL permet crear tota l'estructura d'una base de dades, les relacions entre les dades i les regles que han de complir. Les operacions s贸n de tipus DROP (esborrar), ALTER (modificar) i CREATE (crear).

Base de dades露

La majoria de SGBD permeten crear diferents bases de dades (database) independents. En cada base de dades, es poden definir diferents taules i contindran diferents dades, independents entre elles.

CREATE DATABASE露

La sent猫ncia CREATE DATABASE permet crear una nova base de dades.

T茅 el seg眉ent format:

CREATE [OR REPLACE] {DATABASE | SCHEMA} [IF NOT EXISTS] db_name

  • CREATE: Indica que volem crear la base de dades. Si existeix i no s'especifica cap opci贸 addicional, aquesta sent猫ncia fallar脿.
  • [OR REPLACE]: Par脿metre opcional. Indica que, en cas que existisca pr猫viament, la sobreescriurem (i es perdran les dades anteriors).
  • {DATABASE | SCHEMA}: Es pot utilitzar qualsevol de les dues paraules per indicar que es desitja crear una base de dades. S贸n sin貌nims en aquest context.
  • [IF NOT EXISTS]: Par脿metre opcional. Indica que sols es crea la base de dades en cas que no existisca pr猫viament.
  • db_name: Nom de la base de dades.

Documentaci贸

Documentaci贸 oficial sobre crear bases de dades:

Exemple

Per crear una base de dades anomenada tenda cal executar la sent猫ncia:

CREATE DATABASE tenda;

DROP DATABASE露

La sent猫ncia DROP DATABASE permet eliminar una base de dades existent.

T茅 el seg眉ent format:

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

  • DROP: Indica que volem esborrar la base de dades. Si no existeix i no s'indica cap opci贸 addicional, la sent猫ncia fallar脿.
  • {DATABASE | SCHEMA}: Es pot utilitzar qualsevol de les dues paraules per indicar que es desitja crear una base de dades. S贸n sin貌nims en aquest context.
  • [IF EXISTS]: Par脿metre opcional. Indica que sols s'esborrar脿 la base de dades en cas d'existir.
  • db_name: Nom de la base de dades.

Documentaci贸

Documentaci贸 oficial sobre eliminar bases de dades:

Exemple

Per eliminar una base de dades anomenada tenda cal executar la sent猫ncia:

DROP DATABASE tenda;

SHOW DATABASES露

La sent猫ncia SHOW DATABASES permet mostrar una llista amb les bases de dades existents.

T茅 el seg眉ent format:

SHOW {DATABASES | SCHEMAS}
    [LIKE 'pattern' | WHERE expr]

  • SHOW: Indica que volem mostrar la llista de bases de dades.
  • {DATABASES | SCHEMAS}: Es pot utilitzar qualsevol de les dues paraules per indicar que es desitja crear una base de dades. S贸n sin貌nims en aquest context.
  • [LIKE 'pattern']: Par脿metre opcional. Permet filtrar les bases de dades mostrades a partir d'una condici贸.

Informaci贸

M茅s informaci贸 sobre LIKE:

S'estudiar脿 en la UD5: Data Manipulation Language.

Documentaci贸

Documentaci贸 oficial sobre llistar bases de dades:

Exemple

Per mostrar totes les bases de dades que comencen per la lletra 't' cal executar la comanda:

SHOW DATABASES LIKE 't%';
+---------------+
| Database (t%) |
+---------------+
| tenda         |
+---------------+

USE露

La sent猫ncia USE s'utilitza per a seleccionar una base de dades i indicar que totes les seg眉ents sent猫ncies s'executaran en una base de dades en concret.

T茅 el seg眉ent format:

USE [DATABASE] db_name;

  • USE: Indica que volem utilitzar una base de dades per a les seg眉ents sent猫ncies.
  • [DATABASE]: Par脿metre opcional. No t茅 cap efecte. Disponible a partir de la versi贸 11.3.
  • db_name: Nom de la base de dades.

Documentaci贸

Documentaci贸 oficial sobre seleccionar bases de dades:

Exemple

Per indicar que volem utilitzar la base de dades tenda en les seg眉ents consultes cal utilitzar:

USE tenda;
Database changed

Taules露

Cada base de dades cont茅 taules relacionals que emmagatzemen les dades i les seues relacions.

CREATE TABLE露

La sent猫ncia CREATE TABLE s'utilitza crear una taula en la base de dades.

T茅 el seg眉ent format:

CREATE [OR REPLACE] TABLE [IF NOT EXISTS] table_name (
    field1_name FIELD1_TYPE [OPTIONS] [COSTRAINTS],
    field2_name FIELD2_TYPE [OPTIONS] [COSTRAINTS],
    ...
);

  • CREATE TABLE: Indica que volem crear una taula. Si la taula ja existeix i no s'especifica cap de les opcions [OR REPLACE] o [IF NOT EXISTS], la sent猫ncia fallar脿.
  • [OR REPLACE]: Par脿metre opcional. Indica que sobreescriurem la taula si ja existeix anteriorment.
  • [IF NOT EXISTS]: Par脿metre opcional. Indica que es crear脿 la taula sols si no existeix anteriorment.
  • table_name: Par脿metre opcional. Indica que es crear脿 la taula sols si no existeix anteriorment.

Dins de la taula es poden definir m煤ltiples atributs, que es defineixen de la seg眉ent manera:

field_name FIELD_TYPE [OPTIONS] [CONSTRAINTS]

  • field_name: Nom de l'atribut. Ha de ser 煤nic en la taula.
  • FIELD_TYPE: Tipus de l'atribut. Aquest par脿metre defineix el tipus de dades que s'emmagatzemar脿 en aquesta columna i el seu domini.
  • [OPTIONS]: Par脿metres opcionals per definir diferents opcions de la columna. S'expliquen m茅s endavant.
  • [CONSTRAINTS]: Par脿metres opcional. Defineix les restriccions de la columna. S'expliquen m茅s endavant.

Documentaci贸

Documentaci贸 oficial sobre crear taules:

Exemple

Aquesta sent猫ncia crear脿 les taules cistella_compra i producte en la base de dades tenda.

USE tenda;
CREATE TABLE producte (
    id_producte INT PRIMARY KEY AUTO_INCREMENT,
    nom VARCHAR(50) NOT NULL,
    preu DECIMAL(5, 2) NOT NULL
);

CREATE TABLE cistella_compra (
    id_cistella INT PRIMARY KEY AUTO_INCREMENT
);

SHOW COLUMNS露

La sent猫ncia SHOW COLUMNS permet consultar les columnes d'una taula.

T茅 el seg眉ent format:

SHOW [FULL] {COLUMNS | FIELDS}
    {FROM | IN} tbl_name
    [{FROM | IN} db_name]
    [LIKE 'pattern' | WHERE expr]

  • [FULL]: Par脿metre opcional. Mostra m茅s informaci贸. Si la taula no existeix i no s'especifica l'opci贸 [IF EXISTS], la sent猫ncia fallar脿.
  • {COLUMNS | FIELDS}: Es pot utilitzar qualesvol de les dues paraules.
  • {FROM | IN} tbl_name: Es pot utilitzar qualesvol de les dues paraules. Indica la taula de la qual es volen consultar les columnes.
  • [{FROM | IN} db_name]: Par脿metre opcional. Es pot utilitzar qualesvol de les dues paraules. Indica en quina base de dades est脿 la taula que es vol consultar.
  • [LIKE | WHERE]: Permet filtrar els resultats de la consulta a partir d'una condici贸.

Documentaci贸

Documentaci贸 oficial sobre consultar columnes:

DROP TABLE露

La sent猫ncia DROP TABLE s'utilitza per eliminar una taula en la base de dades.

T茅 el seg眉ent format:

DROP TABLE [IF EXISTS] table_name [, table2_name ...];

  • DROP TABLE: Indica que es vol eliminar una taula. Si la taula no existeix i no s'especifica l'opci贸 [IF EXISTS], la sent猫ncia fallar脿.
  • [IF EXISTS]: Par脿metre opcional. Indica que s'eliminar脿 la taula si existeix.
  • table_name [, table2_name ...]: Nom de la taula que s'eliminar脿. Es poden especificar v脿ries taules separades per comes.

Documentaci贸

Documentaci贸 oficial sobre eliminar taules:

Exemple

Aquesta sent猫ncia eliminar脿 les taules cistella_compra i producte de la base de dades tenda.

USE tenda;
DROP TABLE cistella_compra, producte;

SHOW TABLES露

La sent猫ncia SHOW TABLES s'utilitza per consultar les taules existents en una base de dades.

T茅 el seg眉ent format:

SHOW [FULL] TABLES [FROM db_name]
    [LIKE 'pattern' | WHERE expr]

  • SHOW TABLES: Indica que es consultaran les taules d'una base de dades. Si la taula no existeix i no s'especifica l'opci贸 [IF EXISTS], la sent猫ncia fallar脿.
  • [FULL]: Par脿metre opcional. A m茅s, es mostra el tipus de taula. BASE_TABLE per a una taula relacional, VIEW per a una vista i SEQUENCE per a una seq眉猫ncia.
  • [FROM db_name]: Par脿metre opcional. Permet especificar la base de dades sobre la qual es realitza la consulta.
  • [LIKE | WHERE]: Permet filtrar els resultats de la consulta a partir d'una condici贸.

Documentaci贸

Documentaci贸 oficial sobre mostrar taules:

Exemple

Aquesta sent猫ncia mostra les bases de dades de la base de dades actual.

SHOW TABLES;
+-----------------+
| Tables_in_tenda |
+-----------------+
| cistella_compra |
| producte        |
+-----------------+

ALTER TABLE露

La sent猫ncia ALTER TABLE s'utilitza per modificar la definici贸 d'una taula existent, on es poden afegir, eliminar o modificar atributs i restriccions.

Documentaci贸

Documentaci贸 oficial sobre modificar taules:

ADD露

El modificador ADD permet afegir una columna o restricci贸 a la taula.

T茅 el format:

ALTER TABLE table_name
ADD column_name datatype [OPTIONS];

Exemple

Aquesta sent猫ncia afegeix l'atribut nom_curt a producte.

ALTER TABLE producte
  ADD nom_curt VARCHAR(20);

DROP露

El modificador DROP permet eliminar una columna o restricci贸 a la taula.

T茅 el format:

ALTER TABLE table_name
DROP column_name;

Exemple

Aquesta sent猫ncia elimina l'atribut nom_curt de producte.

ALTER TABLE producte
  DROP nom_curt;

MODIFY露

El modificador MODIFY permet modificar una columna o restricci贸 existent de la taula. Aquesta opci贸 茅s 煤til si no es volen perdre les dades d'una columna al modificar-la.

T茅 el format:

ALTER TABLE table_name
MODIFY column_name datatype [OPTIONS];

Exemple

Aquesta sent猫ncia canvia el tipus de l'atribut nom_curt de la taula producte.

ALTER TABLE producte MODIFY nom_curt varchar(25);

Tipus de dades露

La naturalesa de les dades que es poden emmagatzemar en les bases de dades 茅s molt diversa i que cal tindre en compte per a realitzar un bon disseny d'aquesta.

Cada atribut d'una taula pot emmagatzemar un tipus de dades diferent, que cal especificar. Cal tindre en compte com s'emmagatzemaran les dades, l'espai que ocuparan i el domini per triar un tipus de dades adequat.

Documentaci贸

Documentaci贸 oficial sobre tipus de dades:

Advert猫ncia

En aquest material no s'especifiquen tots els tipus de dades existents, sols els m茅s comuns.

Cal consultar la documentaci贸 per a trobar la llista completa de tipus de dades.

Num猫riques露

Els tipus de dades num猫riques poden representar informaci贸 num猫rica.

Documentaci贸

Documentaci贸 oficial sobre tipus de dades num猫riques:

Per emmagatzemar nombres enters tenim moltes possibilitats, depenent de com de gran (o menut) siguen els nombres a emmagatzemar.

De m茅s menut a m茅s gran:

  • TINYINT o INT1: Nombre enter emmagatzemat en un byte. El domini 茅s [-128, 127] amb signe i [0, 255] sense signe.
  • BOOLEAN: Sin貌nim de TINYINT(1). S'utilitza per emmagatzemar TRUE o FALSE.

    Realment pot emmagatzemar nombres enters en el domini de TINYINT, per貌 en la pr脿ctica es considera que el n煤mero 0 representa FALSE i qualsevol altre n煤mero representa TRUE. - SMALLINT o INT2: Nombre enter emmagatzemat en dos bytes. El domini 茅s [-32768, 32767] amb signe i [0, 65535] sense signe. - MEDIUMINT o INT3: Nombre enter emmagatzemat en tres bytes. El domini 茅s [-8388608, 8388607] amb signe i [0, 16777215] sense signe. - INT o INT4: Nombre enter emmagatzemat en quatre bytes. El domini 茅s [-2147483648, 2147483647] amb signe i [0, 4294967295] sense signe. - BIGNINT o INT8: Nombre enter emmagatzemat en huit bytes. El domini 茅s [-9223372036854775808, 9223372036854775807] amb signe i [0, 18446744073709551615] sense signe.

Per emmagatzemar nombres reals o amb decimals, tenim les seg眉ents possibilitats:

  • FLOAT: Nombre amb coma flotant emmagatzemat en quatre bytes. Permet emmagatzemar nombres decimals amb una precisi贸 simple. Aquest tipus de dades 茅s pres铆s fins a 7 nombres decimals.
  • DOUBLE o REAL: Nombre amb coma flotant de doble precisi贸, emmagatzemat en huit bytes. Permet emmagatzemar nombres decimals amb una precisi贸 "normal". Aquest tipus de dades 茅s prec铆s fins a 15 nombres decimals.
  • DECIMAL[(M[,D]]: Nombre real amb un nombre fix de d铆gits i decimals. M 茅s el nombre total de d铆gits (per defecte 10) i D el nombre de decimals (per defecte 0). Els dos par脿metres s贸n opcionals.

La majoria de dades num猫riques permeten les opcions SIGNED, UNSIGNED i ZEROFILL.

  • SIGNED: Opci贸 per defecte si no s'especifica. Indica que es guardaran dades amb el signe.
  • UNSIGNED: Indica que es guardaran dades amb el sense signe.
  • ZEROFILL: Indica que es guardaran dades amb el sense signe i que s'omplir脿 l'espai sobrant amb zeros a l'esquerra.

Advert猫ncia

A partir de la versi贸 8.0.17 de MySQL, les seg眉ents opcions es consideren obsoletes:

  • ZEROFILL: Considereu utilitzar altres funcionas com LPAD() per obtindre la mateixa funcionalitat.
  • UNSIGNED per als atributs de tipus FLOAT, DOUBLE i DECIMAL: Considereu utilitzar una restricci贸 CHECK.

Cadena de car脿cters露

Les cadenes de car脿cters 茅s un tipus de dades que permet representar informaci贸 alfabeticonum猫rica, o el que 茅s el mateix, dades compostes de lletres, s铆mbols i nombres.

Documentaci贸

Documentaci贸 oficial sobre tipus de dades de cadena de car脿cters:

Depenent de la longitud i format de la cadena, podem trobar les seg眉ents possibilitats:

  • CHAR[(M)]: Permet emmagatzemar una cadena de car脿cters de longitud fixa M. M pot prendre els valors [0, 255]. Si no s'especifica, la M 茅s 1.

    Si les dades s贸n m茅s menudes que la longitud, s'omplir脿 amb espais per l'esquerra.

  • VARCHAR(M): Permet emmagatzemar una cadena de car脿cters de longitud variable, fins a M. M pot prendre els valors [0, 65.532].

  • TEXT: Permet emmagatzemar una cadena de car脿cters de longitud variable fins a 65.535 car脿cters.
    • MEDIUMTEXT, LONGTEXT: Variants que permeten emmagatzemar m茅s car脿cters.
  • ENUM: Permet emmagatzemar un valor entre uns valors predefinits.

    Exemple

    La columna dia_setmana sols pot prendre els valors especificats, que formarien el domini d'aquesta columna.

    dia_setmana ENUM('dilluns', 'dimarts', 'dimecres', 'dijous', 'divendres', 'dissable', 'diumenge')
    

Data i hora露

Les bases de dades tamb茅 estan preparades per a gestionar dades relacionades amb les dates i les hores d'una manera eficient.

Documentaci贸

Documentaci贸 oficial sobre tipus de dades de data i hora:

Tipus de dades:

  • DATE: Emmagatzema una data en el format YYYY-MM-DD.
  • TIME: Emmagatzema una hora en el format HH:MM:SS.ffffff.
  • DATETIME o TIMESTAMP: Emmagatzema una data i hora en el format YYYY-MM-DD HH:MM:SS.ffffff.
  • YEAR: Emmagatzema un any en format de 4 d铆gits.

Exemple露

Exemple

CREATE TABLE persona (
    dni char(9) PRIMARY KEY,
    nom VARCHAR(50) NOT NULL,
    cognoms varchar(100) NOT NULL,
    data_naixement DATE,
    al莽ada INT UNSIGNED,
    pes DECIMAL(5, 2) CHECK (pes >= 0)
);

Aquesta sent猫ncia crea la taula persona amb les columnes:

  • dni: Cadena de car脿cter de longitud fixa 9. Clau prim脿ria.
  • nom: Cadena de car脿cter de longitud variable fins a 50. No pot prendre valors NULL.
  • cognoms: Cadena de car脿cter de longitud variable fins a 100. No pot prendre valors NULL.
  • data_naixement: Data.
  • al莽ada: Nombre enter positiu (sense signe).
  • pes: Nombre decimal positiu amb 2 decimals (nnn,nn).

Definici贸 de columna露

En cada definici贸 d'una columna es poden especificar diferents opcions.

field_name FIELD_TYPE [OPTIONS] [CONSTRAINTS]

Claus露

Clau prim脿ria露

En cada taula es pot definir una sola clau prim脿ria mitjan莽ant les paraules clau PRIMARY KEY. Les claus prim脿ries tenen les restriccions UNIQUE i NOT NULL, 茅s a dir, no poden haver dues entrades amb el mateix valor i no poden haver valors NULL. Una taula sols pot tindre una PRIMARY KEY.

Aquesta opci贸 es pot especificar al costat d'un atribut si i sols si aquest atribut 茅s la clau prim脿ria. Si la clau prim脿ria 茅s la combinaci贸 de m煤ltiples atributs, cal especificar-ho per separat.

field1_name FIELD1_TYPE PRIMARY KEY ...,
PRIMARY KEY(field1_name, field2_name, ...)

Exemple

USE tenda;
CREATE TABLE producte (
    id_producte INT PRIMARY KEY AUTO_INCREMENT,
    nom VARCHAR(50) NOT NULL,
    preu DECIMAL(5, 2) NOT NULL
);

CREATE TABLE cistella_compra (
    id_cistella INT AUTO_INCREMENT,
    PRIMARY KEY(id_cistella)
);

CREATE TABLE cistella_producte (
    id_cistella INT,
    id_producte INT,
    PRIMARY KEY(id_cistella, id_producte),
    ...
);
  • La clau prim脿ria de la taula producte s'ha definit en l'atribut id_producte.
  • La clau prim脿ria de la taula cistella_compra s'ha definit en l'atribut id_cistella. S'ha definit per separat.
  • La clau prim脿ria de la taula cistella_producte s'ha definit en el conjunt d'atributs (id_cistella, id_producte). S'ha definit per separat.

Clau 煤nica露

La restricci贸 UNIQUE s'utilitza per especificar que un atribut, o conjunt d'atributs, no pot contindre valors repetits. Es poden definir m煤ltiples restriccions UNIQUE en una taula. 脡s opcional utilitzar la paraula KEY.

Les claus alternatives haurien de ser definides com a UNIQUE.

De la mateixa manera que passa amb les claus prim脿ries, es pot especificar en la definici贸 d'un atribut si la restricci贸 sols l'afecta aquest. En canvi, si afecta un conjunt d'atributs, s'ha d'especificar per separat.

field1_name FIELD1_TYPE UNIQUE [KEY] ...,
UNIQUE [KEY](field1_name, field2_name, ...)

Clau alternativa

L'atribut n_bastidor, que 茅s una clau alternativa de la taula cotxe, no pot contindre valors repetits i cal ser definida com a UNIQUE.

CREATE TABLE cotxe (
    matricula CHAR(7) PRIMARY KEY,
    n_bastidor CHAR(8) UNIQUE NOT NULL,
    ...
);

Restricci贸 de cardinalitat

La taula permis_conduccio est脿 associada a la taula persona en una cardinalitat (0 ,1) <=> (1, 1), 茅s a dir, un perm铆s de conducci贸 est脿 associat a una persona, per貌 una persona pot no tindre un perm铆s de conducci贸.

Aquesta relaci贸 s'ha modelat mitjan莽ant una propagaci贸 de clau forana a la taula permis_conduccio. Per evitar que una persona puga tindre associats m煤ltiples permisos de conducci贸, cal utilitzar la restricci贸 UNIQUE.

CREATE TABLE permis_conduccio (
    id_permis INT PRIMARY KEY AUTO_INCREMENT,
    data_obtencio DATE NOT NULL,
    dni_conductor char(9) NOT NULL,
    FOREIGN KEY (dni_conductor) REFERENCES persona (dni),
    UNIQUE(dni_conductor)
);

Restricci贸 de cardinalitat en relacions tern脿ries

La restricci贸 UNIQUE tamb茅 s'utilitzar per restringir la cardinalitat en relacions tern脿ries.

La taula ABC representa una relaci贸 tern脿ria entre les taules A, B i C La cardinalitat 茅s la seg眉ent:

  • Per a un element de A i un de B, poden haver N elements de C associats.
  • Per a un element de A i un de C pot haver un element de B associats: UNIQUE(A, C)
  • Per a un element de B i un de C pot haver un element de A associats: UNIQUE(B, C)
CREATE TABLE ABC (
    id_A INT,
    id_B INT,
    id_C INT,
    FOREIGN KEY (id_A) REFERENCES A (id),
    FOREIGN KEY (id_B) REFERENCES B (id),
    FOREIGN KEY (id_C) REFERENCES C (id),
    PRIMARY KEY(id_A, id_B, id_C),
    UNIQUE(id_A, id_C),
    UNIQUE(id_B, id_C)
);

Pregunta

脡s la clau prim脿ria d'aquesta taula el m铆nim subconjunt d'atributs per identificar a cada fila?

La resposta 茅s NO.

Com que els conjunts (A, C) i (B, C) no contenen valors repetits, s贸n claus candidates de la taula. En aquest cas, podem definir una de les dues com a clau prim脿ria, i l'altra seria una clau alternativa.

Clau forana露

Les claus foranes s'utilitzen en el Model Relacional per relacionar unes taules amb altres. La majoria de SGBD SQL utilitzen les paraules clau FOREIGN KEY per indicar que un atribut fa refer猫ncia a un altre atribut d'una taula.

El format 茅s:

FOREIGN KEY (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT]
    [ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT]

  • FOREIGN KEY: Paraules clau per indicar la definici贸 d'una clau forana.
  • (index_col_name, ...): Atribut o conjunt d'atributs de la taula que formen la clau forana.
  • REFERENCES tbl_name (index_col_name,...): Indica que la clau forana fa refer猫ncia als atributs (index_col_name,...) de la taula tbl_name.
    • Els atributs referenciats han de ser una clau prim脿ria.
    • El tipus dels atributs associants han de ser el mateix.
    • Els noms dels atributs de cada taula poden ser diferents
  • ON {DELETE | UPDATE}: Indica el comportament de la taula quan s'esborra o s'edita l'element al qual es fa refer猫ncia en la clau forana.
    • RESTRICT: No deixa eliminar o modificar l'element. Valor per defecte.
    • CASCADE: Elimina tamb茅 les entrades referenciades.

      Si un element de la taula pare 茅s eliminat o modificat, l'eliminaci贸 o modificaci贸 es propagara a tots els elements de la taula filla que el referencien. - SET NULL: El valor de la clau forana passa a ser NULL. - NO ACTION: Sin貌nim de RESTRICT. - SET DEFAULT: El valor de la clau forana passa a ser el valor per defecte especificat en la definici贸 de la columna.

Exemple

USE tenda;
CREATE TABLE producte (
    id_producte INT PRIMARY KEY AUTO_INCREMENT,
    nom VARCHAR(50) NOT NULL,
    preu DECIMAL(5, 2) NOT NULL
);

CREATE TABLE cistella_compra (
    id_cistella INT AUTO_INCREMENT,
    PRIMARY KEY(id_cistella)
);

CREATE TABLE cistella_producte (
    id_cistella INT,
    id_producte INT,
    PRIMARY KEY(id_cistella, id_producte),
    FOREIGN KEY(id_cistella) REFERENCES cistella_compra (id_cistella) ON DELETE CASCADE,
    FOREIGN KEY(id_producte) REFERENCES producte (id_producte)
);
  • La clau prim脿ria de la taula producte s'ha definit en l'atribut id_producte.
  • La clau prim脿ria de la taula cistella_compra s'ha definit en l'atribut id_cistella. S'ha definit per separat. Si s'elimina un registre de la taula cistella, s'eliminaran els registres de la taula cistella_producte associats.
  • La clau prim脿ria de la taula cistella_producte s'ha definit en el conjunt d'atributs (id_cistella, id_producte). S'ha definit per separat.

Altres露

Valors Nuls露

Mitjan莽ant l'opci贸 NULL o NOT NULL es pot especificar si un atribut permet o no valors nuls. Si no s'especifica, per defecte accepta valors NULL.

Exemple

CREATE TABLE cotxe (
    matricula CHAR(7) PRIMARY KEY,
    n_bastidor CHAR(8) UNIQUE NOT NULL,
    marca VARCHAR(50) NOT NULL,
    model VARCHAR(50) NOT NULL,
    km INT UNSIGNED NOT NULL DEFAULT 0,
    dni_propietari CHAR(9),
    data_compra DATE NULL,
    FOREIGN KEY (dni_propietari) REFERENCES persona (dni)
);
  • Els atributs dni_propietari i data_compra de la taula cotxe permeten valors nuls.
  • La resta d'atributs no permeten valors nuls.

Valors per defecte露

Es pot assignar un valor per defecte a una columna mitjan莽ant l'opci贸 DEFAULT. A l'inserir un registre, aquest camp prendr脿 el valor per defecte si no ha sigut especificat en la consulta d'inserci贸.

Si la columna no est脿 definida com a NOT NULL, AUTO_INCREMENT o TIMESTAMP, per defecte s'assignar脿 el valor nul quan no s'especifique: DEFAULT NULL.

Documentaci贸

Documentaci贸 oficial sobre valors per defecte:

Exemple

CREATE TABLE cotxe (
    matricula CHAR(7) PRIMARY KEY,
    n_bastidor CHAR(8) UNIQUE NOT NULL,
    marca VARCHAR(50) NOT NULL,
    model VARCHAR(50) NOT NULL,
    km INT UNSIGNED NOT NULL DEFAULT 0,
    dni_propietari CHAR(9),
    data_compra DATE NULL,
    FOREIGN KEY (dni_propietari) REFERENCES persona (dni)
);

INSERT INTO cotxe (matricula, n_bastidor, marca, model)
    values ("4231KJL", "16483920", "Ford", "Focus");

SELECT * FROM cotxe;
+-----------+------------+-------+-------+----+----------------+-------------+
| matricula | n_bastidor | marca | model | km | dni_propietari | data_compra |
+-----------+------------+-------+-------+----+----------------+-------------+
| 4231KJL   | 16483920   | Ford  | Focus |  0 | NULL           | NULL        |
+-----------+------------+-------+-------+----+----------------+-------------+

En la consulta anterior, s'ha inserit un cotxe en el qual no s'ha especificat el propietari ni la data de compra.

  • El valor de km 茅s 0.
  • El valor de dni_propietari 茅s nul.
  • El valor de data_compra 茅s nul.

AUTO_INCREMENT露

L'opci贸 AUTO_INCREMENT s'utilitza per a indicar que el valor d'una columna pot ser directament assignat amb un comptador.

  • Aquesta opci贸 sols est脿 disponible per als nombres enters.
  • L'opci贸 sols pot ser utilitzada en una clau prim脿ria.
  • Sols pot haver un atribut amb l'opci贸 AUTO_INCREMENT en la taula.

El valor d'aquest camp s'assignar脿 en ordre, encara que pot ser especificat en la consulta d'inserci贸.

Exemple

CREATE TABLE producte (
    id_producte INT PRIMARY KEY AUTO_INCREMENT,
    nom VARCHAR(50) NOT NULL,
    preu DECIMAL(5, 2) NOT NULL
);

INSERT INTO producte (nom, preu) values
    ("Barra de pa", "0.5"),
    ("Botella d'aigua", "1");

INSERT INTO producte (id_producte, nom, preu) values
    (10, "Napolitana xocolate", "1.5");

SELECT * FROM producte;
+-------------+---------------------+------+
| id_producte | nom                 | preu |
+-------------+---------------------+------+
|           1 | Barra de pa         | 0.50 |
|           2 | Botella d'aigua     | 1.00 |
|          10 | Napolitana xocolate | 1.50 |
+-------------+---------------------+------+

S'han realitzat tres insercions a la taula producte:

  • La ID del producte Barra de pa ha obtingut el valor del comptador: 1
  • La ID del producte Botella d'aigua ha obtingut el valor del comptador: 2
  • La ID del producte Napolitana xocolate ha obtingut el valor de la consulta: 10

COMMENT露

L'opci贸 COMMENT s'utilitza per a assignar un comentari a una columna.

Els comentaris es poden consultar mitjan莽ant la consulta:

SHOW FULL COLUMNS;

Documentaci贸

Documentaci贸 oficial sobre els comentaris:

Restriccions露

Les bases de dades permeten la implementaci贸 de restriccions en les columnes de les taules, que poden ser establides en el moment de la creaci贸 de la taula (CREATE TABLE) o a posteriori (ALTER TABLE).

Es consideren com a restriccions:

  • PRIMARY KEY: Clau prim脿ria. No es permeten valors repetits ni valors nuls.
  • FOREIGN KEY: Clau forana. Refer猫ncia la clau prim脿ria d'una altra taula. El valor ha d'existir en la taula referenciada i ha de ser del mateix tipus.
  • UNIQUE: No es permeten valors repetits.
  • CHECK: Permet decidir si una dada 茅s v脿lida o no respecte d'una condici贸 establida.

Totes les restriccions (excepte FOREIGN KEY) poden ser especificades en la mateixa definici贸 de l'atribut, sempre que sols afecten eixe atribut concret.

No obstant aix貌, les restriccions tamb茅 poden ser assignades al final de la creaci贸 de la taula i, en aquest cas, poden afectar a m茅s d'un atribut.

El format 茅s:

[CONSTRAINT [constraint_name]] constraint_expression

constraint_expression:
  | PRIMARY KEY (index_col_name, ...)  ...
  | FOREIGN KEY (index_col_name, ...) 
       REFERENCES tbl_name (index_col_name, ...)
       [ON DELETE reference_option]
       [ON UPDATE reference_option]
  | UNIQUE [INDEX|KEY] (index_col_name, ...)
  | CHECK (check_constraints)

Les restriccions poden ser identificades per un nom mitjan莽ant CONSTRAINT <name> al pricipi de l'expressi贸.

CHECK露

Es poden definir restriccions concretes a un atribut mitjan莽ant l'opci贸 CHECK. Aquesta opci贸 avaluar脿 la condici贸 especificada per cada valor associat:

  • En cas vertader (TRUE), deixar脿 inserir el valor.
  • En cas fals (FALSE), no deixar脿 inserir el valor.

Exemple

S'ha afegit la columna descompte a la taula producte. Volem evitar que el descompte puga ser major de 100%, per tant, definim una restriccu贸 CHECK.

CREATE TABLE producte (
    id_producte INT PRIMARY KEY AUTO_INCREMENT,
    nom VARCHAR(50) NOT NULL,
    preu DECIMAL(5, 2) NOT NULL,
    descompte DECIMAL(5, 2) UNSIGNED NOT NULL DEFAULT 0 CHECK (descompte <= 100)
);
INSERT INTO producte (nom, preu, descompte) values
    ("Barra de pa", "0.5", 20);
INSERT INTO producte (nom, preu, descompte) values
    ("Botella d'aigua", "1", 120);
Error Code: 3819. Check constraint 'producte_chk_1' is violated.
馃搶 Aquest document pot quedar desactualitzat despr茅s d鈥檌mprimir-lo. Pots consultar la versi贸 m茅s recent a la p脿gina web.
馃尶 Abans d鈥檌mprimir aquest document, considera si 茅s realment necessari. Redueix el consum de paper i ajuda a protegir el nostre entorn.