Salta el contingut

DDL - Creació de Taules i Restriccions

Una Base de Dades pot contenir molts tipus d’Objectes, i no estem parlant del paradigma de la Orientació a Objectes.

Els principals tipus d’Objectes són:

  • Taules

  • Índexs

  • Vistes

  • Restriccions: de camp, de PK, de FK, ...

  • Seqüències

Alguns d’aquests tipus d’objectes ocupen força espai en disc: Taules i Índexs.

Altres tipus d’objectes només necessiten espai per emmagatzemar-ne la definició de l’objecte: Vistes, Restriccions: de camp, de PK, de FK, ... i Seqüències

Esquema de la Base de Dades

La BD emmagatzema les definicions de tots els objectes de la mateixa en el diccionari de dades. Aquestes definicions estan disponibles pels usuaris.

Aquesta informació s’emmagatzema en unes taules de la base mysql accessible per l’usuari root (DBA) o bé la base information_schema per l’usuari root i la resta d’usuaris.

Aquesta mateixa informació és la que utilitza el SGBD per a saber els noms de taules, columnes, usuaris, restriccions, etc.

És el que diu la Primera regla de Codd: Tota la informació en una base de dades relacional es representa implícitament en el nivell lògic d’una manera: amb valors en taules. Fins i tot les metadades.

Regles

Totes les dades en un SGBDR s’emmagatzema en taules.

Per crear una taula, utilitzarem les següents Regles (MariaDB):

  • el nom de la taula començarà amb una lletra,

  • ha de tenir entre 1 i 64 caràcters

  • només pot contenir A-Z, a-z, 0-9, _ (caràcter de subratllat), $

  • no pot tenir el mateix nom que qualsevol altre objecte de la mateixa base de dades

  • no pot ser una paraula reservada.

CREATE TABLE

Per a crear una taula cal tenir el permís de CREATE.

Per crear una taula, utilitzarem la comanda CREATE TABLE seguint, com a nomenclatura, les regles anteriors.

CREATE [OR REPLACE] TABLE [IF NOT EXISTS] < taula1 > (
    { <nom_columna> <tipus> [NOT NULL | NULL]
      [ DEFAULT <valor> | (expressió) ]
      [ AUTO_INCREMENT ]
      [ UNIQUE | PRIMARY KEY ]
      [ CHECK (expr) ]
    },
    { [ INDEX [index_name] (index_col_name,...) ] },
    { CONSTRAINT <nom_restricció>
      [ PRIMARY KEY (index_col_name,...) ] |
      [ UNIQUE (index_col_name,...) ] |
      [ FOREIGN KEY (index_col_name,...)
      REFERENCES <taula> (index_col_name,...) ] |
      [ CHECK (expressió) ]
    }
)

Exemples de CREATE TABLE

Exemple de CREATE TABLE
CREATE TABLE PAISOS(
    ID_PAIS CHAR(2) PRIMARY KEY,
    NOM_PAIS VARCHAR(40) NOT NULL
);
CREATE TABLE ADRECES (
    ID_ADRECA INT(4) AUTO_INCREMENT,
    CARRER VARCHAR(40),
    CODI_POSTAL CHAR(5)
    CHECK (CODI_POSTAL BETWEEN '01000' AND '52999'),
    MUNICIPI VARCHAR(30) NOT NULL,
    PROVINCIA VARCHAR(25),
    ID_PAIS CHAR(2) DEFAULT 'ES',
    CONSTRAINT PK_ADRECES PRIMARY KEY(ID_ADRECA),
    CONSTRAINT FK_ADRECES_PAISOS FOREIGN KEY(ID_PAIS)
        REFERENCES PAISOS(ID_PAIS)
);
Afegim dades
INSERT INTO PAISOS VALUES
  ('ES','ESPANYA'),
  ('AD','ANDORRA'),
  ('CA','CANADA'),
  ('FR','FRANÇA'),
  ('GB','GRAN BRETANYA'),
  ('CH','XINA'),
  ('JP','JAPÓ'),
  ('IT','ITÀLIA'),
  ('US','ESTATS UNITS D\'AMÈRICA');
INSERT INTO ADRECES VALUES
  (null, 'c/ Sol', '17003', 'GIRONA', 'GIRONA', default);
INSERT INTO ADRECES (MUNICIPI)
  VALUES ('QUART');
INSERT INTO ADRECES (CARRER, CODI_POSTAL, MUNICIPI)
  VALUES ('c/ Girona', '08010','BARCELONA');
INSERT INTO ADRECES (MUNICIPI, ID_PAIS)
  VALUES ('COTLLIURE', 'FR');

Si al fer els INSERT des de mode comanda dona error...

pot ser pel tipus de codificació de caràcters. Recorda treballar amb cp850. Pots modificar-ho a la sessió amb la comanda

SET NAMES=cp850;

Comprova la codificació de caràcters utilitzada amb la comanda

status
Possible resposta
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    cp850
Conn.  characterset:    cp850