Ejemplo 1

Veamos ahora como crear las bases de datos y tablas correspondientes a los ejemplos que vamos siguiendo desde el principio del curso.

Nuestro primer ejemplo tenía este esquema:

Estación(Identificador, Latitud, Longitud, Altitud)
Muestra(IdentificadorEstacion, Fecha, Temperatura mínima, Temperatura máxima,
  Precipitaciones, Humedad mínima, Humedad máxima, Velocidad del viento mínima,
  Velocidad del viento máxima)

Y habíamos elegido los siguientes tipos para cada columna:

Columna Tipo
Identificador MEDIUMINT UNSIGNED
Latitud VARCHAR(14)
Longitud VARCHAR(15)
Altitud MEDIUMINT
IdentificadorEstacion MEDIUMINT UNSIGNED
Fecha DATE
Temperatura mínima TINYINT
Temperatura máxima TINYINT
Precipitaciones SMALLINT UNSIGNED
Humedad mínima TINYINT UNSIGNED
Humedad máxima TINYINT UNSIGNED
Velocidad del viento mínima SMALLINT UNSIGNED
Velocidad del viento máxima SMALLINT UNSIGNED

Primero crearemos una base de datos, a la que podemos llamar "meteo":

mysql> CREATE DATABASE meteo;
Query OK, 1 row affected (0.02 sec)

Podemos situarnos en la base de datos, usando la USE o bien crear las tablas usando el nombre completo, es decir, mediante el prefijo "meteo.". Empecemos con la primera tabla:

mysql> USE meteo
Database changed
mysql> CREATE TABLE estacion (
    -> identificador MEDIUMINT UNSIGNED NOT NULL,
    -> latitud VARCHAR(14) NOT NULL,
    -> longitud VARCHAR(15) NOT NULL,
    -> altitud MEDIUMINT NOT NULL,
    -> PRIMARY KEY (identificador)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.30 sec)

Hemos creado una clave primaria, y como es obligatorio, hemos definido la columna 'indentificador' como NOT NULL. Usaremos tablas InnoDB ya que queremos que MySQL haga el control de las claves foráneas.

Veamos ahora la segunda tabla:

mysql> CREATE TABLE muestra (
    -> identificadorestacion MEDIUMINT UNSIGNED NOT NULL,
    -> fecha DATE NOT NULL,
    -> temperaturaminima TINYINT,
    -> temperaturamaxima TINYINT,
    -> precipitaciones SMALLINT UNSIGNED,
    -> humedadminima TINYINT UNSIGNED,
    -> humedadmaxima TINYINT UNSIGNED,
    -> velocidadminima SMALLINT UNSIGNED,
    -> velocidadmaxima SMALLINT UNSIGNED,
    -> KEY (identificadorestacion),
    -> FOREIGN KEY (identificadorestacion)
    -> REFERENCES estacion(identificador)
    -> ON DELETE NO ACTION
    -> ON UPDATE CASCADE
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.16 sec)

A falta de datos concretos en el enunciado sobre qué hacer con las muestras de estaciones si estas desaparecen, hemos optado por mantener el valor de la clave foránea. También hemos decidido modificar el identificador si se cambia en la tabla de estaciones.

Ejemplo 2

El segundo ejemplo consiste en modelar una biblioteca. Este era el esquema:

Libro(ClaveLibro, Título, Idioma, Formato, ClaveEditorial)
Tema(ClaveTema, Nombre)
Autor(ClaveAutor, Nombre)
Editorial(ClaveEditorial, Nombre, Dirección, Teléfono)
Ejemplar(ClaveEjemplar, ClaveLibro, NúmeroOrden, Edición, Ubicación, Categoría)
Socio(ClaveSocio, Nombre, Dirección, Teléfono, Categoría)
Préstamo(ClaveSocio, ClaveEjemplar, NúmeroOrden, Fecha_préstamo,
  Fecha_devolución, Notas)
Trata_sobre(ClaveLibro, ClaveTema)
Escrito_por(ClaveLibro, ClaveAutor)

Y los tipos para las columnas:

Columna Tipo
ClaveLibro INT
Titulo VARCHAR(60)
Idioma VARCHAR(15)
Formato VARCHAR(15)
ClaveTema SMALLINT
Nombre(tema) VARCHAR(40)
ClaveAutor INT
Nombre(autor) VARCHAR(60)
ClaveEditorial SMALLINT
Nombre(editorial) VARCHAR(60)
Direccion(editorial) VARCHAR(60)
Telefono(editorial) VARCHAR(15)
ClaveEjemplar INT
NumeroOrden SMALLINT
Edicion SMALLINT
Ubicacion VARCHAR(15)
Categoria(libro) CHAR
ClaveSocio INT
Nombre(socio) VARCHAR(60)
Direccion(socio) VARCHAR(60)
Telefono(socio) VARCHAR(15)
Categoria(socio) CHAR
Fecha_prestamo DATE
Fecha_devolucion DATE
Notas BLOB

Empecemos por crear la base de datos:

mysql> CREATE DATABASE biblio;
Query OK, 1 row affected (0.16 sec)

mysql>USE biblio
Database changed
mysql>

Ahora crearemos las tablas. Primero crearemos la tabla de editoriales, ya que su clave primaria se usa como clave foránea en la tabla de libros:

mysql> CREATE TABLE editorial (
    -> claveeditorial SMALLINT NOT NULL,
    -> nombre  VARCHAR(60),
    -> direccion VARCHAR(60),
    -> telefono VARCHAR(15),
    -> PRIMARY KEY (claveeditorial)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.09 sec)

mysql>

Ahora podemos crear la tabla de libros:

mysql> CREATE TABLE libro (
    -> clavelibro INT NOT NULL,
    -> titulo VARCHAR(60),
    -> idioma VARCHAR(15),
    -> formato VARCHAR(15),
    -> claveeditorial SMALLINT,
    -> PRIMARY KEY (clavelibro),
    -> KEY(claveeditorial),
    -> FOREIGN KEY (claveeditorial)
    -> REFERENCES editorial(claveeditorial)
    -> ON DELETE SET NULL
    -> ON UPDATE CASCADE
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.11 sec)

mysql>

Seguimos con las tablas de tema, autor:

mysql> CREATE TABLE tema (
    -> clavetema SMALLINT NOT NULL,
    -> nombre VARCHAR(40),
    -> PRIMARY KEY (clavetema)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.06 sec)

mysql> CREATE TABLE autor (
    -> claveautor INT NOT NULL,
    -> nombre VARCHAR(60),
    -> PRIMARY KEY (claveautor)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.09 sec)

mysql>

Seguimos con la tabla ejemplar, que recordemos que contiene entidades subordinadas de libro:

mysql> CREATE TABLE ejemplar (
    -> claveejemplar INT NOT NULL,
    -> clavelibro INT NOT NULL,
    -> numeroorden SMALLINT NOT NULL,
    -> edicion SMALLINT,
    -> ubicacion VARCHAR(15),
    -> categoria CHAR,
    -> PRIMARY KEY (claveejemplar),
    -> FOREIGN KEY (clavelibro)
    -> REFERENCES libro(clavelibro)
    -> ON DELETE CASCADE
    -> ON UPDATE CASCADE
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.11 sec)

mysql>

Seguimos con la tabla de socio:

mysql> CREATE TABLE socio (
    -> clavesocio INT NOT NULL,
    -> nombre VARCHAR(60),
    -> direccion VARCHAR(60),
    -> telefono VARCHAR(15),
    -> categoria CHAR,
    -> PRIMARY KEY (clavesocio)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.08 sec)

mysql>

Ahora la tabla de prestamo:

mysql> CREATE TABLE prestamo (
    -> clavesocio INT,
    -> claveejemplar INT,
    -> numeroorden SMALLINT,
    -> fecha_prestamo DATE NOT NULL,
    -> fecha_devolucion DATE DEFAULT NULL,
    -> notas BLOB,
    -> FOREIGN KEY (clavesocio)
    -> REFERENCES socio(clavesocio)
    -> ON DELETE SET NULL
    -> ON UPDATE CASCADE,
    -> FOREIGN KEY (claveejemplar)
    -> REFERENCES ejemplar(claveejemplar)
    -> ON DELETE SET NULL
    -> ON UPDATE CASCADE
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.16 sec)

mysql>

Sólo nos quedan por crear las tablas trata_sobre y escrito_por:

mysql> CREATE TABLE trata_sobre (
    -> clavelibro INT NOT NULL,
    -> clavetema SMALLINT NOT NULL,
    -> FOREIGN KEY (clavelibro)
    -> REFERENCES libro(clavelibro)
    -> ON DELETE CASCADE
    -> ON UPDATE CASCADE,
    -> FOREIGN KEY (clavetema)
    -> REFERENCES tema(clavetema)
    -> ON DELETE CASCADE
    -> ON UPDATE CASCADE
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.11 sec)

mysql> CREATE TABLE escrito_por (
    -> clavelibro INT NOT NULL,
    -> claveautor INT NOT NULL,
    -> FOREIGN KEY (clavelibro)
    -> REFERENCES libro(clavelibro)
    -> ON DELETE CASCADE
    -> ON UPDATE CASCADE,
    -> FOREIGN KEY (claveautor)
    -> REFERENCES autor(claveautor)
    -> ON DELETE CASCADE
    -> ON UPDATE CASCADE
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.13 sec)

mysql>

Comentarios de los usuarios (5)

Juan
2012-04-22 20:41:18

mysql> CREATE TABLE prestamo (

-> clavesocio INT,

-> claveejemplar INT,

-> numeroorden SMALLINT,

-> fecha_prestamo DATE NOT NULL,

-> fecha_devolucion DATE DEFAULT NULL,

-> notas BLOB,

-> FOREIGN KEY (clavesocio)

-> REFERENCES socio(clavesocio)

-> ON DELETE SET NULL

-> ON UPDATE CASCADE,

-> FOREIGN KEY (clavelibro) <== debe ser claveejemplar

-> REFERENCES ejemplar(clavelibro)

-> ON DELETE SET NULL

-> ON UPDATE CASCADE

-> ) ENGINE=InnoDB;

Query OK, 0 rows affected (0.16 sec)

Otro fallo encontre, que no me iba y creo que fue por eso, lo pongo por si os sirve pa correjirlo

Juan
2012-04-22 21:10:36

bueno tambien falta tabla autor

mysql> CREATE TABLE autor (

-> claveautor INT PRIMARY KEY,

-> nombre VARCHAR(60))

-> ENGINE=INNODB;

Query OK, 0 rows affected (0.10 sec)

La ultima tabla no se creaba ya que la clave foranea no econtraba esa tabla, el resto funciona perfectamnte

Juan
2012-04-22 21:12:14

a no perdonadme xD que no me fije k tabla autor fue justo debajo de otra, graxias

Salvador Pozo
2012-04-23 11:02:26

Gracias de nuevo, Juan. Corregida la tabla de préstamos.

FRANCISCO JAVIER
2018-09-25 06:57:02

Me gustaría que explicara la inserción de datos en las tablas de InnoDB, como actualizar, eliminar y esas cosas.

Se lo agradeceré.