Sei sulla pagina 1di 19

'(6$552//2'($3/,&$&,21(6:(%

1
%$6(6'('$726

TEMA 3. CREACIÓN DE BASES DE DATOS


EN MYSQL

1. Creación de la base de datos

2. Creación de tablas

3. Motor de almacenamiento

4. Verificaciones

5. Eliminación de tablas

6. Eliminación de la base de datos

1. Creación de la base de datos


Una base de datos en un sistema relacional está compuesta por un conjunto de
tablas, que corresponden a las relaciones del modelo relacional.

En la terminología usada en SQL no se alude a las relaciones, del mismo modo


que no se usa el término atributo, pero sí la palabra columna, y no se habla de tupla,
sino de línea.

En este tema se usarán indistintamente ambas terminologías, por lo que tabla


estará en lugar de relación, columna en el de atributo y línea en el de tupla, y viceversa.

Prácticamente, la creación de la base de datos consiste en la creación de las


tablas que la componen.

En realidad, antes de poder proceder a la creación de las tablas, normalmente


hay que crear la base de datos.

La sintaxis del comando SQL que nos permite crear una base de datos es:

CREATE DATABASE nombre_base de datos;

Podemos averiguar cuantas bases de datos existen en nuestro sistema, utilizando


el comando:
'(6$552//2'($3/,&$&,21(6:(% 2
%$6(6'('$726

SHOW DATABASES;

Una vez creada la base de datos, y para evitar tener que nombrar la base de datos
en cada comando SQL que ejecutemos, podemos poner la base de datos por defecto.
Para ello usaremos el comando USE:

USE nombre_base de datos

Use no es en realidad un comando SQL, sino más bien una opción de MySQL.
Hay que tener cuidado a la hora de ejecutar USE en la consola de MySQL pues es la
única sentencia que no lleva punto y coma al final.

2. Creación de tablas
Para crear tablas usamos la sentencia CREATE TABLE.

La sintaxis de esta sentencia es muy compleja, ya que existen muchas opciones y


tenemos muchasposibilidades diferentes a la hora de crear una tabla. Iremos viendo las
más importantes paso a paso.

En su forma más simple, la sentencia CREATE TABLE creará una tabla con las
columnas quele indiquemos.

Si quisieramos crear, por ejemplo, una tabla en la que almacenemos nombres de


personas y sus fechas de nacimiento, deberemos indicar el nombre de la tabla y los
nombres y tipos de las columnas:

CREATE TABLE gente (nombre VARCHAR(40), fecha DATE);

Con este comando hemos creado una tabla llamada "gente" con dos columnas:
"nombre" que puede contener cadenas dehasta 40 caracteres y "fecha" de tipo fecha.

Podemos consultar cuántas tablas y qué nombres tienen en una base de datos,
usando la sentenciaSHOW TABLES.

MySQL distingue una serie de tipos de datos que podremos utilizar a la hora de
crear los campos queformarán nuestras tablas. Veamos a continuación estos tipos:

Tipo Texto (Char(x), Varchar(x), Text, TinyText, MediumText, LongText):

Char(x): Tipo de datos que admite caracteres alfanuméricos. La longitud de


estecampo varía entre 1-255 y está delimitado a la longitud especificada
entreparéntesis (x) en el momento de la creación del campo de la tabla.
Alintroducir datos en este campo siempre se solicitará el número decaracteres
especificados. Si creamos un campo con Char(5) deberemosintroducir cinco
caracteres cada vez que incluyamos un dato en esecampo. Si incluimos menos,
'(6$552//2'($3/,&$&,21(6:(%
3
%$6(6'('$726

MySQL rellenará los caracteres que faltanhasta el número indicado con


espacios.
Varchar(x): Tipo de datos que admite caracteres alfanuméricos. Su uso es
similar aChar (x). A la hora de definir un campo de datos Varchar
deberemosespecificar el número máximo de caracteres que podrá aceptar en
laentrada de datos, donde x es un número entre 1-255. A diferencia deChar, este
tipo de datos es variable en su longitud, admitiendo entradasinferiores a la
establecida.
Text, TinyText, MediumText, LongText: Mediante la declaración de este tipo
de datosse admiten la inclusión decadenas alfanuméricas "case-insensitive" de
longitudes variables.TinyTextadmite un máximo de 255 caracteres, Text admite
65.535,MediumText permite introducir textos de hasta 16.777.215
caracteres,LongText nos ofrece la posibilidad de incluir un máximo de
4.294.967.295caracteres. Estos campos no necesitan de especificaciones de
longitud ala hora de ser declarados.

Tipo Binario (Blob, TinyBlob, MediumBlob, LongBlob):

Blob: Un tipo de datos Blob es un objeto binario que puede almacenar


cualquiertipo de datos o información, desde un archivo de texto con todo su
formato(se diferencia en esto del tipo Text) hasta imágenes, archivos de sonidoo
video, etc. Al igual que el tipo Text, Blob admite hasta 65.535caracteres.
TinyBlob,MediumBlob,LongBlob: Son datos del mismo tipo que el anterior
pero que varían en cuanto a sutamaño, así TinyBlob admite hasta 255 caracteres
máximo, MediumBlobacepta tamaños de hasta 16.777.215 de caracteres y
LongBlob4.294.967.295 caracteres (como vemos estos tamaños se
correspondencon los de TinyText, MediumText y LongText).

Tiponumérico (TinyInt, SmallInt, MediumInt, Int, BigInt, Float, Double,


Decimal):

Int: Este es un tipo de datos numéricos de tipo entero. Este tipo de datos guarda
valores enteros (no decimales) entre -2.147.483.648 y 2.147.483.647.
TinyiInt, SmallInt, MediumInt, BigInt: Son tipos de datos numéricos enteros
(no decimal). TinyiInt agrupa un rango de números entre -128 y 127. SmallInt
alcanza desde -32.768 hasta 32.767. MediumInt tiene un rango comprendido
entre -8.388.608 y 8.388.607. Finalmente el tipo de datos BigInt ocupa un rango
numérico entre -9.223.372.036.854.775.808 hasta 9.223.372.036.854.775.807.
Float (M,D): Número de coma flotante de precisión simple. El valor del
argumento M nos indica el número de dígitos decimales que se van a utilizar
para representar el número. Así, un valor de 5 nos permitirá representar números
comprendidos entre -99 y 99 (Números expresados en binario con 5 dígitos y
signo). El valor del argumento D nos indica el número de posiciones decimales
que se van a utilizar en la representación del número. Así, una representación
tipo Float (5,2) nos permitirá incluir números entre -99,99 y 99,99. El rango de
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
4

los números de coma flotante de precisión simple es de -3,402823466E+38 a -


1,175494351E-38, 0, y 1,175494351E-38 hasta 3,402823466E+38.
Double (M, D): Número de coma flotante de precisión doble. Es un tipo de
datos igual al anterior cuya única diferencia es el rango numérico que abarca,
siendo este el comprendido entre 1,7976931348623157E+308 hasta -
2,.2250738585072014E-308, 0, y 2,2250738585072014E-308 hasta
1,7976931348623157E+308
Decimal (M, D): Su uso es similar al de los anteriores, pero, en este caso, D
puede tener valor 0. El rango de este número es el mismo que el de número con
coma flotante de precisión doble.

TipoFecha-Hora (Date, DateTime, TimeStamp, Time, Year):

Date: Formato de Fecha. Su representación es en formato de fecha numérica del


tipo 'YYYY-MM-DD' (Año con cuatro dígitos, Mes con dos dígitos, día con dos
dígitos). Su rango es '1000-01-01' (1 de enero del año 1000 hasta 31 de
diciembre del 9999)
DateTime: Es una combinación de formato de fecha y hora conjuntamente. Su
representación es 'YYYY-MM-DD HH:MM:SS' (Año con cuatro dígitos, Mes
con dos dígitos, día con dos dígitos, hora con dos dígitos, minutos con dos
dígitos, segundos con dos dígitos). El rango que soporta este formato es de
'1000-01-01 00:00:00' (las 00 horas, 00 minutos, 00 segundos del 1 de enero del
año 1000) hasta '9999-12-31 23:59:59' (las 23 horas, 59 minutos, 59 segundos
del 31 de diciembre del año 9999).
TimeStamp (N): Este es un tipo de datos muy particular. Necesita de un
argumento N que puede ser uno de estos números; 14, 12, 10, 8, 6, 4, 2. N
representa el número de dígitos que se utilizarán para representar un valor de
fecha y hora comprendido desde el inicio del año 1970 hasta algún momento del
año 2037. Así: TimeStamp(14): YYYYMMDDHHMMSS (Año 4 dígitos + mes
+ día + hora + minutos + segundos 2 dígitos); TimeStamp(12):
YYMMDDHHMMSS (Año 2 dígitos + mes + día + hora + minutos + segundos
2 dígitos); TimeStamp(10): YYMMDDHHMM (Año + mes + día + hora +
minutos 2 dígitos); TimeStamp(8): YYMMDDHH (Año + mes + día + hora 2
dígitos); TimeStamp(6): YYMMDD (Año + mes + día 2 dígitos);
TimeStamp(4): YYMM (Año + mes 2 dígitos); TimeStamp(2): YY (Año 2
dígitos)
Time: Tipo de datos con formato de Hora. MySQL muestra valores de hora con
formato 'HH:MM:SS'.
Year (D): Tipo de datos con formato de año. Su representación puede ser
'YYYY' (año con formato de 4 dígitos) o 'YY' (año con formato de 2 dígitos)
donde el valor del argumento D puede ser 4 o 2 respectivamente.

Tenemos muchas más opciones a la hora de definir columnas. Además del tipo y
del nombre,podemos definir valores por defecto, permitir o no que contengan valores
nulos, crear una claveprimaria, indexar...
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
5

La sintaxis para definir columnas es:

nombre_col tipo [NOT NULL | NULL] [DEFAULT


valor_por_defecto][AUTO_INCREMENT] [[PRIMARY] KEY] [COMMENT 'string']

Veamos cada una de las opciones por separado.

Valores nulos
Al definir cada columna podemos decidir si podrá o no contener valores nulos.

Es importante esta opción ya que, en el modelo relacional, las columnas que son
o forman parte de una clave primaria no pueden contener valores nulos.

Un poco más adelante veremos que, si definimos una columna como clave
primaria, automáticamente se impide que puedacontener valores nulos, pero este no es
el único caso en que puede ser interesante impedir laasignación de valores nulos para
una columna.

La opción por defecto es que se permitan valores nulos, NULL, y para que no se
permitan, se usa NOTNULL. Por ejemplo:

CREATE TABLE ciudad1 (nombre CHAR(20) NOT NULL, poblacion


INTNULL);

Valores por defecto

Para cada columna también se puede definir, opcionalmente, un valor por


defecto. El valor por defectose asignará de forma automática a una columna cuando no
se especifique un valor determinado alañadir filas.

Si una columna puede tener un valor nulo, y no se especifica un valor por


defecto, se usará NULLcomo valor por defecto. En el ejemplo anterior, el valor por
defecto para poblacion es NULL.

Por ejemplo, si queremos que el valor por defecto para poblacion sea 5000,
podemos crear la tablacomo:

CREATE TABLE ciudad2 (nombre CHAR(20) NOT NULL,poblacion INT NULL


DEFAULT 5000);

Claves primarias

También se puede definir una clave primaria sobre una columna, usando la
palabra clave KEY oPRIMARY KEY.
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
6

Sólo puede existir una clave primaria en cada tabla, y la columna sobre la que se
define una claveprimaria no puede tener valores NULL. Si esto no se especifica de
forma explícita, MySQL lo hará deforma automática.

Por ejemplo, si queremos crear un índice en la columna nombre de la tabla de


ciudades, crearemos latabla así:

CREATE TABLE ciudad3 (nombreCHAR(20) NOT NULL PRIMARY


KEY,poblacion INT NULL DEFAULT 5000);

UsarNOT NULL PRIMARY KEYequivale a PRIMARY KEY, NOT NULL KEY o


sencillamenteKEY.

Existe una sintaxis alternativa para crear claves primarias, que en general es
preferible, ya que es máspotente. De hecho, la que hemos explicado es un alias para la
forma general, que no admite todas lasfunciones (como por ejemplo, crear claves
primarias sobre varias columnas). Veremos esta otraalternativa un poco más abajo.

Columnas autoincrementadas
En MySQL tenemos la posibilidad de crear una columna autoincrementada,
aunque esta columna sólopuede ser de tipo entero.

Si al insertar una fila se omite el valor de la columna autoincrementada o si se


inserta un valor nulopara esa columna, su valor se calcula automáticamente, tomando el
valor más alto de esa columna ysumándole una unidad. Esto permite crear, de una
forma sencilla, una columna con un valor únicopara cada fila de la tabla.

Generalmente, estas columnas se usan como claves primarias 'artificiales'.


MySQL está optimizadopara usar valores enteros como claves primarias, de modo que
la combinación de clave primaria, quesea entera y autoincrementada es ideal para usarla
como clave primaria artificial:

CREATE TABLE ciudad5 (clave INT AUTO_INCREMENT PRIMARY KEY,


nombre CHAR(20) NOT NULL,poblacion INT NULL DEFAULT 5000);

Comentarios

Adicionalmente, al crear la tabla, podemos añadir un comentario a cada


columna. Este comentariosirve como información adicional sobre alguna característica
especial de la columna, y entra en elapartado de documentación de la base de datos:

CREATE TABLE ciudad6(clave INT AUTO_INCREMENT PRIMARY KEY


COMMENT 'Clave principal',nombreCHAR(50) NOT NULL,poblacion INT NULL
DEFAULT 5000);
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
7

Definición de creación
A continuación de las definiciones de las columnas podemos añadir otras
definiciones. La sintaxis másgeneral es:

definición_columnas| PRIMARY KEY (index_nombre_col,...)| KEY


[nombre_index] (nombre_col_index,...)| INDEX [nombre_index]
(nombre_col_index,...)| UNIQUE [INDEX][nombre_index] [tipo_index]
(nombre_col_index,...)| FOREIGN KEY[nombre_index] (nombre_col_index,...)
[definición_referencia]

Veremos ahora cada una de estas opciones.

Índices
Un índice es un grupo de datos que MySQL asocia con una o varias columnas de
la tabla. En este grupo de datos aparece la relación entre el contenido y el número de fila
donde está ubicado.

Los índices sirven para optimizar las consultas y las búsquedas de datos en las
tablas, evitando que MySQL tenga que revisar todos los datos disponibles para devolver
el resultado. Mediante su uso es mucho más rápido localizar filas con determinados
valores de columnas, o seguir un determinado orden. La alternativa es hacer búsquedas
secuenciales, que en tablas grandes requieren mucho tiempo.

Podemos crear índices para un campo de la tabla o para varios.

Algunas reglas para la creación de índices son:

Se deben crear índices sobre aquellas columnas que vayan a ser usadas en una
cláusula WHERE.
Son mejores candidatas a indexar aquellas columnas que presentan muchos
valores distintos, mientras que no son buenas candidatas las que tienen muchos
valores idénticos, como por ejemplo sexo (masculino y femenino) porque cada
consulta implicará siempre recorrer prácticamente la mitad del índice.
Si necesitamos un select del tipo SELECT ... WHERE columna_1 = X AND
columna_2 = Y y ya tenemos un índice con la columna_1, podemos crear un
segundo índice con la columna 2 o, mejor todavía, crear un único índice
combinado con las columnas 1 y 2. Estos son los índices multicolumna, o
compuestos. No obstante los índices multicolumna en las claúsulas WHERE
deben incluir siempre de izquierda a derecha las columnas indexadas o el índice
no se usará. No obstante si tienes índices multicolumna y los utilizas en las
clausulas WHERE, debes incluir siempre de izquierda a derecha las columnas
indexadas o el indice no se usará. Por ejemplo, supongamos que tenemos un
índice USUARIO (ID, NOMBRE, DIRECCION), y una cláusula SELECT ...
WHERE NOMBRE = x. Este select no aprovechará el índice. Tampoco lo haría
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
8

un SELECT ... WHERE ID =x AND DIRECCION = y. Cualquier consulta que


incluya una columna parte del índice sin incluir además las columnas a su
izquierda, no usará el índice. Por tanto en nuestro ejemplo solo sacarían
provecho del indice las consultas SELECT ... WHERE ID = x, o WHERE ID = X
AND NOMBRE = y o WHERE ID = x AND NOMBRE = y AND DIRECCION =
Z.

La creación de índices también tiene desventajas que es necesario conocer para


poder mejorar el rendimiento de nuestra base de datos:

Los índices se actualizan cada vez que se modifica la columna o columnas que
utiliza. Por ello no es aconsejable usar como índices columnas en las que serán
frecuentes operaciones de escritura (INSERT, UPDATE, DELETE).
Tampoco tendría sentido crear índices sobre columnas cuando cualquier select
sobre ellos va a devolver una gran cantidad de resultados; por ejemplo una
columna booleana que admita los valores Y/N.
Tampoco es necesario usar índices en tablas demasiado pequeñas, ya que en
estos casos no hay ganancia de rapidez frente a una consulta normal.

Tenemos cuatro tipos de índices. El primero corresponde a las claves primarias,


que como vimos, también se pueden crear en la parte de definición de columnas.

Claves primarias

La sintaxis para definir claves primarias es:

definición_columnas| PRIMARY KEY (index_nombre_col,...)

El ejemplo anterior que vimos para crear claves primarias, usando esta sintaxis,
quedaría así:

CREATE TABLE ciudad4 (nombre CHAR(20) NOT NULL,poblacion INT NULL


DEFAULT 5000, PRIMARY KEY (nombre));

Pero esta forma tiene más opciones, por ejemplo, entre los paréntesis podemos
especificar varios nombres de columnas, para construir claves primarias compuestas por
varias columnas:

CREATE TABLE mitabla1 (id1 CHAR(2) NOT NULL,id2 CHAR(2) NOT


NULL,texto CHAR(30),PRIMARY KEY (id1, id2));

Índices

El segundo tipo de índice permite definir índices sobre una columna, sobre
varias, o sobre partes de columnas. Para definir estos índices se usan indistintamente las
opciones KEY o INDEX.
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
9

CREATE TABLE mitabla2 (id INT,nombre CHAR(19),INDEX (nombre));

O su equivalente:

CREATE TABLE mitabla3 (id INT,nombre CHAR(19),KEY (nombre));

También podemos crear un índice sobre parte de una columna:

CREATE TABLE mitabla4 (id INT,nombre CHAR(19),INDEX (nombre(4)));

Este ejemplo usará sólo los cuatro primeros caracteres de la columna 'nombre'
para crear el índice.

Se pueden añadir índices a una tabla después de creada con la sentencia ALTER
TABLE:

ALTER TABLE nombre_tabla ADD INDEX nombre_indice


(columna_indexada);

Para eliminar un índice usamos también ALTER TABLE:

ALTER TABLE nombre_tabla DROP INDEX nombre_indice.

Índices únicos

El tercero permite definir índices con claves únicas, también sobre una columna,
sobre varias o sobre partes de columnas. Para definir índices con claves únicas se usa la
opción UNIQUE. La diferencia entre un índice único y uno normal es que en los únicos
no se permite la inserción de filas con claves repetidas. La excepción es el valor NULL,
que sí se puede repetir.

CREATE TABLE mitabla5 (id INT,nombre CHAR(19),UNIQUE (nombre));

Una clave primaria equivale a un índice de clave única, en la que el valor de la


clave no puede tomar valores NULL. Tanto los índices normales como los de claves
únicas sí pueden tomar valores NULL. Por lo tanto, las definiciones siguientes son
equivalentes:

CREATE TABLE mitabla6 (id INT,nombre CHAR(19) NOT NULL,UNIQUE


(nombre));

CREATE TABLE mitabla7 (id INT,nombre CHAR(19), PRIMARY KEY


(nombre));

Índices fulltext
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
10

Se usan en tablas del tipo MyISAM, que veremos un poco más adelante qué tipo
de tablas son, y pueden contener uno o más campos del tipo CHAR, VARCHAR y TEXT.

Un índice de texto completo está diseñado para facilitar y optimizar la búsqueda


de palabras clave en tablas que tienen grandes cantidades de información en campos de
texto.

Las búsquedas de texto completo son ejecutadas con la función MATCH( ). Esta
función ejecuta la búsqueda de una cadena en una colección de texto (un conjunto de
una o más columnas incluídas en un índice FULLTEXT). La cadena que se busca es
dada como un argumento en la función AGAINST( ), y es ejecutada en modo no
sensitivo, es decir, no importa el uso de mayúsculas y minúsculas.

Veamos algunos ejemplos de la utilización de índices Full-Text:

CREATE TABLE articulos( id INT NOT NULL AUTO_INCREMENT PRIMARY


KEY, titulo VARCHAR(200), contenido TEXT, FULLTEXT indice_tc(titulo,contenido) )
engine=myisam;

INSERT INTO articulos VALUES (0,'MySQL con Java en MSWindows', 'En


este artículo se explica como combinar las ...');

INSERT INTO articulos VALUES (0,'Manejo de datos BLOB con PHP y


MySQL', 'Los detalles del almacenamiento y recuperación de ...');

INSERT INTO articulos VALUES (0,'Tutorial básico de MySQL', 'Se explica el


uso del programa cliente mysql ...');

INSERT INTO articulos VALUES (0,'MySQL con Java en Linux', 'Conozca como
utilizar estas dos herramientas ...');

INSERT INTO articulos VALUES (0,'Manejo de campos BLOB con MySQL y


Visual Basic', 'En este artículo se explican los detalles del manejo ...');

INSERT INTO articulos VALUES (0,'MySQL bajoMSWindows', 'A continuación


se explica el procedimiento de ...');

SELECT id, titulo, contenido FROM artículos WHERE MATCH


(titulo,contenido) AGAINST ('Java');

Devuelve las filas que contengan „Java‟ en las columnas del índice FullText (2
filas).

SELECT id, titulo, contenido FROM artículos WHERE MATCH


(titulo,contenido) AGAINST ('MySQL');
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
11

Igual que la anterior, pero no devuelve nada. La razón es que las palabras que
aparecen en más de un 50% de los casos se consideran palabras que “hacen ruido” y no
se tienen en cuenta.

SELECT id, titulo, contenido FROM artículos WHERE MATCH


(titulo,contenido) AGAINST ('Java Visual');

Se puede incluir en la búsqueda más de una palabra. En este caso buscamos filas
que contengan las palabras Java o Visual. Al invertir el orden de las palabras de
búsqueda se obtiene el mismo resultado.

SELECT id, titulo, contenido FROM artículos WHERE MATCH


(titulo,contenido) AGAINST ('PHP');

Buscamos PHP, pero no se devuelve nada, ya que las palabras de menos de tres
caracteres se excluyen de los índices.

Normalmente, como mencionamos antes, los índices se crean al crear la tabla


con la que están relacionados, pero también pueden ser creados de forma independiente
con CREATE INDEX:

CREATE [UNIQUE|FULLTEXT] INDEX index_name ON tbl_name


(index_col_name,...)

Claves foráneas
En MySQL sólo existe soporte para claves foráneas en tablas de tipo InnoDB.
Sin embargo, esto noimpide usarlas en otros tipos de tablas.

La diferencia consiste en que en esas tablas no se verifica si una clave foránea


existe realmente en latabla referenciada, y que no se eliminan filas de una tabla con una
definición de clave foránea. Parahacer esto hay que usar tablas InnoDB.

Hay dos modos de definir claves foráneas en bases de datos MySQL.

El primero, sólo sirve para documentar, y no define realmenteclaves foráneas.


Esta forma consiste en definir una referencia al mismo tiempo que se define
unacolumna:

CREATE TABLE personas (id INT AUTO_INCREMENT PRIMARY


KEY,nombreVARCHAR(40),fecha DATE);

CREATE TABLE telefonos (numeroCHAR(12),id INT NOT NULL


REFERENCES personas (id)ON DELETE CASCADE ON UPDATE CASCADE); (1)

Hemos usado una definición de referencia para la columna 'id' de la tabla


'telefonos', indicando que esuna clave foránea correspondiente a la columna 'id' de la
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
12

tabla 'personas' (1). Sin embargo, aunque lasintaxis se comprueba, esta definición no
implica ningún comportamiento por parte de MySQL.

La otra forma es mucho más útil, aunque sólo se aplica a tablas InnoDB.

En esta forma no se añade la referencia en la definición de la columna, sino


después de la definición detodas las columnas. Tenemos la siguiente sintaxis resumida:

CREATE TABLE nombredefinición_de_columnasFOREIGN KEY


[nombre_index](nombre_col_index,...)[REFERENCES nombre_tabla
[(nombre_col,...)][ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION |
SET DEFAULT][ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION |
SETDEFAULT]]

El ejemplo anterior, usando tablas InnoDB y esta definición de claves foráneas


quedará así:

CREATE TABLE personas2 (id INT AUTO_INCREMENT PRIMARY


KEY,nombreVARCHAR(40),fecha DATE)ENGINE=InnoDB;

CREATE TABLE telefonos2 (numeroCHAR(12),id INT NOT NULL,KEY (id),


(2)FOREIGN KEY (id) REFERENCES personas2 (id)ON DELETE CASCADE ON
UPDATE CASCADE) (3)ENGINE=InnoDB;

Es imprescindible que la columna que contiene una definición de clave foránea


esté indexada (2). Peroesto no debe preocuparnos demasiado, ya que si no lo hacemos
de forma explícita, MySQL lo hará pornosotros de forma implícita.

Esta forma define una clave foránea en la columna 'id', que hace referencia a la
columna 'id' de la tabla'personas' (3). La definición incluye las tareas a realizar en el
caso de que se elimine una fila en la tabla'personas'.

ON DELETE <opción>, indica que acciones se deben realizar en la tabla actual


si se borra una fila enla tabla referenciada.

ON UPDATE <opción>, es análogo pero para modificaciones de claves.

Existen cinco opciones diferentes. Veamos lo que hace cada una de ellas:
RESTRICT: esta opción impide eliminar o modificar filas en la tabla
referenciada si existenfilas con el mismo valor de clave foránea.
CASCADE: borrar o modificar una clave en una fila en la tabla
referenciada con un valordeterminado de clave, implica borrar las filas
con el mismo valor de clave foránea o modificar losvalores de esas
claves foráneas.
SET NULL: borrar o modificar una clave en una fila en la tabla
referenciada con un valordeterminado de clave, implica asignar el valor
NULL a las claves foráneas con el mismo valor.
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
13

NO ACTION: las claves foráneas no se modifican, ni se eliminan filas en


la tabla que lascontiene.
SET DEFAULT: borrar o modificar una clave en una fila en la tabla
referenciada con un valordeterminado implica asignar el valor por
defecto a las claves foráneas con el mismo valor.

Por ejemplo, veamos esta definición de la tabla 'telefonos':

CREATE TABLE telefonos3 (numeroCHAR(12),id INT NOT NULL,KEY


(id),FOREIGN KEY (id) REFERENCES personas (id)ON DELETE RESTRICT ON
UPDATE CASCADE)ENGINE=InnoDB;

Si se intenta borrar una fila de 'personas' con un determinado valor de 'id', se


producirá un error siexisten filas en la tabla 'telefonos3' con mismo valor en la columna
'id'. La fila de 'personas' no seeliminará, a no ser que previamente eliminemos las filas
con el mismo valor de clave foránea en'teléfonos3'.Si se modifica el valor de la columna
'id' en la tabla 'personas', se modificarán los valores de la columna'id' para mantener la
relación.

Veamos un ejemplo más práctico. En la tabla personas, que tiene las columnas
id, nombre y fecha, nos encontramos los siguientes valores:

1 Fulanito 1998/04/14
2 Menganito 1975/06/18
3 Tulanito 1984/07/05

En la tabla telefonos, que tiene las columnas numero e id, nos encontramos los
siguientes valores:

12322132 1
12332221 1
55546545 3
55565445 3

Si intentamos borrar la fila correspondiente a "Fulanito" se producirá un error,


ya que existen dos filasen 'telefonos' con el valor 1 en la columna 'id'.Sí será posible
borrar la fila correspondiente a "Menganito", ya que no existe ninguna fila en la
tabla'telefonos' con el valor 2 en la columna 'id'.

Si modificamos el valor de 'id' en la fila correspondiente a "Tulanito", por el


valor 4, por ejemplo, seasignará el valor 4 a la columna 'id' de las filas 3ª y 4ª de la tabla
'telefonos'. Las tablas quedarían entonces con los siguientes valores:

personas:

1 Fulanito 1998/04/14
2 Menganito 1975/06/18
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
14

4 Tulanito 1984/07/05

telefonos:

12322132 1
12332221 1
55546545 4
55565445 4

3. Motor de almacenamiento

El servidor MySQL incorpora una característica única llamada "motores de


almacenamiento", que nos permite seleccionar el tipo de almacenamientointerno de
cada tabla, en base al que mejor se adecúe a una situaciónparticular.

Dicha selección, la hace el desarrollador a nivel de tabla, y noafecta a la manera


en que el servidor interactúa con el cliente: los comandosSQL serán los mismos sea cual
sea el motor de almacenamiento escogido. Elcliente no necesita saber cómo se guardan
los datos.

Al diseñar una base de datos con MySQL será necesario decidir qué motores
dealmacenamiento vamos a utilizar.

MySQL dispone de una docena de motores de almacenamiento propios, más


losmotores externos desarrollados por terceras partes que se pueden incorporaral
servidor.

Los más importantes son:

ISAM: motor original de MySQL.


MyISAM: Es el motor por defecto. Es muy rápido pero no transaccional.
Reemplaza a ISAM.
InnoDB: Tablas de transacción segura con bloqueo de fila y claves
foráneas.
Memory (Heap): Es una tabla MyISAM, pero almacenada en memoria, no
endisco. Es todavía más rápida.
MERGEoMRG_MyISAM: Una colección de tablas MyISAM usadas como
una única tabla.
BerkeleyDB o BDB: Tablas de transacción segura con bloqueo de página.

Generalmente usaremos tablas MyISAM o tablas InnoDB.

Naturalmente es posible utilizar distintos motores en una misma base de datos.


La decisión correcta depende en gran parte del uso futuro que tendrá labase de datos. Y
eso, suele ser difícil saberlo con exactitud durante el diseño.
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
15

De todas formas, estos son algunos de los criterios a considerar:

Transacciones y concurrencia: Si vamos a necesitar transacciones y


alta concurrencia de usuarios,probablementeInnoDB será la mejor
opción. Es decir, que obtendremos mejorescondiciones de rendimiento si
las tablas que se vayan a ver involucradasfrecuentemente en consultas
transacciones y que sufran una alta concurrencia deusuarios se basan en
el motor InnoDB.Si la concurrencia no es tan alta, pero seguimos
necesitando transacciones, tantoInnoDB como BDB pueden ser la
solución.El motor MyISAM no soporta transacciones. Pero si no las
necesitamos,MyISAM será con toda probabilidad la mejor opción.
Copias de seguridad: La realización de copias de seguridad también
condiciona la elección de tablas.Si podemos detener periódicamente la
base de datos para realizarlas, cualquiermotor servirá. Pero si debemos
realizarlas “en caliente” la elección será mucho máscomplicada.
Características especiales: Por último, las características especiales de
nuestra aplicación pueden obligarnosa recurrir a un tipo determinado de
motor de almacenamiento.En concreto, si nuestra aplicación depende de
la capacidad para contarrápidamente el número de registros de una tabla
(SELECT COUNT(*) FROM)recurriremos a MyISAM, que siempre sabe
cuántos registros tiene sin necesidad decontarlos. Sin embargo, InnoDB
debe realizar la cuenta.Así mismo, recurriremos a MyISAM si
necesitamos realizar eficientementebúsquedas por texto completo
(WHEREnotas LIKE '%...).Pero sin embargo, InnoDB será la solución en
los casos en los que necesitemosdisponer de integridad referencial.

La parte final de la sentencia CREATE TABLEpermite especificar el motor de


almacenamiento que se utilizará en la tabla.

La sintaxis es:

{ENGINE} = {BDB|HEAP|ISAM|InnoDB|MERGE|MRG_MYISAM|MYISAM }

Ejemplo:

CREATE TABLE City (...) ENGINE=InnoDB;

4. Verificaciones

Disponemos de varias sentencias para verificar o consultar características de


tablas.

Podemos ver la estructura de una tabla usando la sentencia SHOW COLUMNS,


por ejemplo:

SHOW COLUMNS FROM gente;


'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
16

También podemos ver la instrucción usada para crear una tabla, mediante la
sentencia SHOW CREATE TABLE:

SHOW CREATE TABLE gente;

5. Eliminación de tablas

A veces es necesario eliminar una tabla, ya sea porque es más sencillo crearla de
nuevo que modificarla,o porque ya no es necesaria.

Para eliminar una tabla se usa la sentencia DROP TABLE. La sintaxis es simple:

DROP TABLE [IF EXISTS] tbl_name [, tbl_name] ...

Por ejemplo:

DROP TABLE ciudad6;

Se pueden añadir las palabras IF EXISTS para evitar errores si la tabla a eliminar
no existe.

DROP TABLE IF EXISTS ciudad6;

6. Eliminación de la base de datos

De modo parecido, se pueden eliminar bases de datos completas, usando la


sentenciaDROP_DATABASE nombre_base_de_datos.

La sintaxis también es muy simple. Hay que tener cuidado, ya que al borrar
cualquier base de datos se elimina también cualquier tabla quecontenga.

DROP DATABASE IF EXISTS biblioteca;

EJERCICIOS

 Crear la base de datos meteo y, en ella, crear las siguientes tablas:

Estacion(Identificador, Latitud, Longitud, Altitud)

Muestra(IdentificadorEstacion, Fecha, TemperaturaMinima, TemperaturaMaxima,


Precipitaciones, HumedadMinima, HumedadMaxima,
VelocidadVientoMinima,VelocidadVientoMaxima)

Los tipos para las columnas son:

Estacion:
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
17

Identificador MEDIUMINT UNSIGNED


Latitud VARCHAR(14)
Longitud VARCHAR(15)
Altitud MEDIUMINT

Muestra:
IdentificadorEstacion MEDIUMINT UNSIGNED
Fecha DATE
TemperaturaMinimaTINYINT
TemperaturaMaxima TINYINT
Precipitaciones SMALLINT UNSIGNED
HumedadMinimaTINYINT UNSIGNED
HumedadMaximaTINYINT UNSIGNED
VelocidadVientoMinimaSMALLINT UNSIGNED
VelocidadVientoMaximaSMALLINT UNSIGNED

La clave primaria en la tabla Estacion será la columna Identificador. En la tabla


Muestra serán lascolumnasIdentificadorEstacion, Fecha. Definir todas estascolumnas
cómo no nulas.

Añadir un índice al campo IdentificadorEstacion de la tabla Muestra y poner cómo


no nulos los campos Latitud, Longitud y Altitud de la tabla Estacion.

El campo IdentificadorEstacion de la tabla Muestra es clave ajena de la tabla


Estacion. Definir la clave ajena en la tabla utilizando el valor NO ACTION para el
borrado y CASCADE para la actualización.

Usar para ambas tablas el motor de almacenamiento InnoDB para que MySQL
permita el uso de claves ajenas.

 Crear la base de datosbiblio y, en ella, crear las siguientes tablas:

Libro (ClaveLibro, Titulo, Idioma, Formato, Categoria, ClaveEditorial)

Tema(ClaveTema, Nombre)

Autor(ClaveAutor, Nombre)

Editorial(ClaveEditorial, Nombre, Direccion, Telefono)

Ejemplar (ClaveLibro, NumeroOrden, Edicion, Ubicacion)

Socio (ClaveSocio, Nombre, Direccion, Telefono, Categoria)

Prestamo (ClaveSocio, ClaveLibro, NumeroOrden,


FechaPrestamo,FechaDevolucion, Notas)
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
18

TrataSobre(ClaveLibro, ClaveTema)

EscritoPor(ClaveLibro, ClaveAutor)

Crear las tablas con las siguientes indicaciones y tipos de columnas:

Libro:La clave primaria será ClaveLibro. Añadir un índice en el campo


ClaveEditorial. ClaveEditorial es clave ajena de la tabla Editorial. Usar las opciones
SET NULL para borrado y CASCADE para modificación. Utilizar el motor de
almacenamiento InnoDB.

ClaveLibro INT
Titulo VARCHAR(60)
Idioma VARCHAR(15)
Formato VARCHAR(15)
Categoria(libro) CHAR
ClaveEditorial SMALLINT

Tema:La clave primaria será ClaveTema. Utilizar el motor de almacenamiento


InnoDB.

ClaveTema SMALLINT
Nombre(tema) VARCHAR(40)

Autor:La clave primaria será ClaveAutor. Utilizar el motor de almacenamiento


InnoDB.

ClaveAutor INT
Nombre(autor) VARCHAR(60)

Editorial:La clave primaria será ClaveEditorial. Utilizar el motor de


almacenamiento InnoDB.

ClaveEditorial SMALLINT
Nombre(editorial) VARCHAR(60)
Direccion(editorial) VARCHAR(60)
Telefono(editorial) VARCHAR(15)

Ejemplar:La clave primaria estará formada por las columnas ClaveLibro,


NumeroOrden. ClaveLibro es clave ajena de la tabla Libro. Usar las opciones
CASCADE para modificación y borrado. Utilizar el motor de almacenamiento InnoDB.

ClaveLibro INT
NumeroOrden SMALLINT
Edicion SMALLINT
Ubicacion VARCHAR(15)
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
19

Socio:La clave primaria será ClaveSocio. Utilizar el motor de almacenamiento


InnoDB.

ClaveSocio INT
Nombre(socio) VARCHAR(60)
Direccion(socio) VARCHAR(60)
Telefono(socio) VARCHAR(15)
Categoria(socio) CHAR

Prestamo:La clave primaria estará formada por las columnas ClaveSocio,


ClaveLibro, FechaPrestamo. ClaveSocio es clave ajena de la tabla Socio. Usar las
opciones SET NULL para borrado y CASCADE para modificación. ClaveLibro es
clave ajena de la tabla Ejemplar. Usar las opciones SET NULL para borrado y
CASCADE para modificación. Utilizar el motor de almacenamiento InnoDB.

ClaveSocio INT
ClaveLibro INT
NumeroOrden SMALLINT
FechaPrestamo DATE
FechaDevolucion DATE
Notas BLOB

TrataSobre:La clave primaria estará formada por las columnas ClaveLibro,


ClaveTema. ClaveLibro es clave ajena de la tabla Libro. Usar las opciones CASCADE
para borrado y modificación. ClaveTema es clave ajena de la tabla Tema. Usar las
opciones CASCADE para borrado y modificación. Utilizar el motor de almacenamiento
InnoDB.

ClaveLibro INT
ClaveTema SMALLINT

EscritoPor:La clave primaria estará formada por las columnas ClaveLibro,


ClaveAutor. ClaveLibro es clave ajena de la tabla Libro. Usar las opciones CASCADE
para borrado y modificación. ClaveAutor es clave ajena de la tabla Autor. Usar las
opciones CASCADE para borrado y modificación. Utilizar el motor de almacenamiento
InnoDB.

ClaveLibro INT
ClaveAutor INT

Potrebbero piacerti anche