Está en la página 1de 19

CREACIN DE BASES DATOS EN MYSQL

1. Creacin de la base de datos

2. Creacin de tablas

3. Motor de almacenamiento

4. Verificaciones

5. Eliminacin de tablas

6. Eliminacin de la base de datos

1. Creacin 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 terminologa usada en SQL no se alude a las relaciones, del mismo modo


que no se usa el trmino atributo, pero s la palabra columna, y no se habla de tupla,
sino de lnea.

En este tema se usarn indistintamente ambas terminologas, por lo que tabla


estar en lugar de relacin, columna en el de atributo y lnea en el de tupla, y viceversa.

Prcticamente, la creacin de la base de datos consiste en la creacin de las


tablas que la componen.

En realidad, antes de poder proceder a la creacin 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:
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 ms bien una opcin 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. Creacin 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 muchas posibilidades diferentes a la hora de crear una tabla. Iremos viendo las
ms importantes paso a paso.

En su forma ms simple, la sentencia CREATE TABLE crear una tabla con las
columnas que le indiquemos.

Si quisiramos 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 de hasta 40 caracteres y "fecha" de tipo fecha.

Podemos consultar cuntas tablas y qu nombres tienen en una base de datos,


usando la sentencia SHOW TABLES.

MySQL distingue una serie de tipos de datos que podremos utilizar a la hora de
crear los campos que formarn nuestras tablas. Veamos a continuacin estos tipos:

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

Char(x): Tipo de datos que admite caracteres alfanumricos. La longitud de este


campo vara entre 1-255 y est delimitado a la longitud especificada entre
parntesis (x) en el momento de la creacin del campo de la tabla. Al introducir
datos en este campo siempre se solicitar el nmero de caracteres especificados.
Si creamos un campo con Char(5) deberemos introducir cinco caracteres cada
vez que incluyamos un dato en ese campo. Si incluimos menos, MySQL
rellenar los caracteres que faltan hasta el nmero indicado con espacios.
Varchar(x): Tipo de datos que admite caracteres alfanumricos. Su uso es
similar a Char (x). A la hora de definir un campo de datos Varchar deberemos
especificar el nmero mximo de caracteres que podr aceptar en la entrada de
datos, donde x es un nmero entre 1-255. A diferencia de Char, este tipo de
datos es variable en su longitud, admitiendo entradas inferiores a la establecida.
Text, TinyText, MediumText, LongText: Mediante la declaracin de este tipo
de datos se admiten la inclusin de cadenas alfanumricas "case-insensitive" de
longitudes variables. TinyText admite un mximo 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 mximo de
4.294.967.295caracteres. Estos campos no necesitan de especificaciones de
longitud a la hora de ser declarados.

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

Blob: Un tipo de datos Blob es un objeto binario que puede almacenar cualquier
tipo de datos o informacin, desde un archivo de texto con todo su formato (se
diferencia en esto del tipo Text) hasta imgenes, archivos de sonido o 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 varan en cuanto a su tamao, as TinyBlob admite hasta 255 caracteres
mximo, MediumBlob acepta tamaos de hasta 16.777.215 de caracteres y
LongBlob4.294.967.295 caracteres (como vemos estos tamaos se corresponden
con los de TinyText, MediumText y LongText).

Tipo numrico (TinyInt, SmallInt, MediumInt, Int, BigInt, Float, Double,


Decimal):

Int: Este es un tipo de datos numricos 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 numricos enteros
(no decimal). TinyiInt agrupa un rango de nmeros 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
numrico entre -9.223.372.036.854.775.808 hasta 9.223.372.036.854.775.807.
Float (M,D): Nmero de coma flotante de precisin simple. El valor del
argumento M nos indica el nmero de dgitos decimales que se van a utilizar
para representar el nmero. As, un valor de 5 nos permitir representar nmeros
comprendidos entre -99 y 99 (Nmeros expresados en binario con 5 dgitos y
signo). El valor del argumento D nos indica el nmero de posiciones decimales
que se van a utilizar en la representacin del nmero. As, una representacin
tipo Float (5,2) nos permitir incluir nmeros entre -99,99 y 99,99. El rango de
los nmeros de coma flotante de precisin simple es de -3,402823466E+38 a -
1,175494351E-38, 0, y 1,175494351E-38 hasta 3,402823466E+38.
Double (M, D): Nmero de coma flotante de precisin doble. Es un tipo de
datos igual al anterior cuya nica diferencia es el rango numrico 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 nmero es el mismo que el de nmero con
coma flotante de precisin doble.

Tipo Fecha-Hora (Date, DateTime, TimeStamp, Time, Year):

Date: Formato de Fecha. Su representacin es en formato de fecha numrica del


tipo 'YYYY-MM-DD' (Ao con cuatro dgitos, Mes con dos dgitos, da con dos
dgitos). Su rango es '1000-01-01' (1 de enero del ao 1000 hasta 31 de
diciembre del 9999)
DateTime: Es una combinacin de formato de fecha y hora conjuntamente. Su
representacin es 'YYYY-MM-DD HH:MM:SS' (Ao con cuatro dgitos, Mes
con dos dgitos, da con dos dgitos, hora con dos dgitos, minutos con dos
dgitos, segundos con dos dgitos). 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
ao 1000) hasta '9999-12-31 23:59:59' (las 23 horas, 59 minutos, 59 segundos
del 31 de diciembre del ao 9999).
TimeStamp (N): Este es un tipo de datos muy particular. Necesita de un
argumento N que puede ser uno de estos nmeros; 14, 12, 10, 8, 6, 4, 2. N
representa el nmero de dgitos que se utilizarn para representar un valor de
fecha y hora comprendido desde el inicio del ao 1970 hasta algn momento del
ao 2037. As: TimeStamp(14): YYYYMMDDHHMMSS (Ao 4 dgitos + mes
+ da + hora + minutos + segundos 2 dgitos); TimeStamp(12):
YYMMDDHHMMSS (Ao 2 dgitos + mes + da + hora + minutos + segundos
2 dgitos); TimeStamp(10): YYMMDDHHMM (Ao + mes + da + hora +
minutos 2 dgitos); TimeStamp(8): YYMMDDHH (Ao + mes + da + hora 2
dgitos); TimeStamp(6): YYMMDD (Ao + mes + da 2 dgitos);
TimeStamp(4): YYMM (Ao + mes 2 dgitos); TimeStamp(2): YY (Ao 2
dgitos)
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 ao. Su representacin puede ser
'YYYY' (ao con formato de 4 dgitos) o 'YY' (ao con formato de 2 dgitos)
donde el valor del argumento D puede ser 4 o 2 respectivamente.

Tenemos muchas ms opciones a la hora de definir columnas. Adems del tipo y


del nombre, podemos definir valores por defecto, permitir o no que contengan valores
nulos, crear una clave primaria, indexar...

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 opcin ya que, en el modelo relacional, las columnas que son
o forman parte de una clave primaria no pueden contener valores nulos.

Un poco ms adelante veremos que, si definimos una columna como clave


primaria, automticamente se impide que pueda contener valores nulos, pero este no es
el nico caso en que puede ser interesante impedir la asignacin de valores nulos para
una columna.

La opcin 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 tambin se puede definir, opcionalmente, un valor por


defecto. El valor por defecto se asignar de forma automtica a una columna cuando no
se especifique un valor determinado al aadir filas.

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


defecto, se usar NULL como valor por defecto. En el ejemplo anterior, el valor por
defecto para poblacin es NULL.

Por ejemplo, si queremos que el valor por defecto para poblacin sea 5000,
podemos crear la tabla como:

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


NULL DEFAULT 5000);

Claves primarias

Tambin se puede definir una clave primaria sobre una columna, usando la
palabra clave KEY o PRIMARY KEY.
Slo puede existir una clave primaria en cada tabla, y la columna sobre la que se
define una clave primaria no puede tener valores NULL. Si esto no se especifica de
forma explcita, MySQL lo har de forma automtica.

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


ciudades, crearemos la tabla as:

CREATE TABLE ciudad3 (nombre CHAR(20) NOT NULL PRIMARY KEY,


poblacion INT NULL DEFAULT 5000);

Usar NOT NULL PRIMARY KEY equivale a PRIMARY KEY, NOT NULL KEY o
sencillamente KEY.

Existe una sintaxis alternativa para crear claves primarias, que en general es
preferible, ya que es ms potente. De hecho, la que hemos explicado es un alias para la
forma general, que no admite todas las funciones (como por ejemplo, crear claves
primarias sobre varias columnas). Veremos esta otra alternativa un poco ms abajo.

Columnas autoincrementadas
En MySQL tenemos la posibilidad de crear una columna autoincrementada,
aunque esta columna slo puede ser de tipo entero.

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


inserta un valor nulo para esa columna, su valor se calcula automticamente, tomando el
valor ms alto de esa columna y sumndole una unidad. Esto permite crear, de una
forma sencilla, una columna con un valor nico para cada fila de la tabla.

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


MySQL est optimizado para usar valores enteros como claves primarias, de modo que
la combinacin 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 aadir un comentario a cada


columna. Este comentario sirve como informacin adicional sobre alguna caracterstica
especial de la columna, y entra en el apartado de documentacin de la base de datos:

CREATE TABLE ciudad6(clave INT AUTO_INCREMENT PRIMARY KEY


COMMENT 'Clave principal', nombre CHAR(50) NOT NULL, poblacion INT NULL
DEFAULT 5000);
Definicin de creacin
A continuacin de las definiciones de las columnas podemos aadir otras
definiciones. La sintaxis ms general es:

definicin_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,...)
[definicin_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 relacin entre el contenido y el nmero de fila
donde est ubicado.

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

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

Algunas reglas para la creacin de ndices son:

Se deben crear ndices sobre aquellas columnas que vayan a ser usadas en una
clusula WHERE.
Son mejores candidatas a indexar aquellas columnas que presentan muchos
valores distintos, mientras que no son buenas candidatas las que tienen muchos
valores idnticos, como por ejemplo sexo (masculino y femenino) porque cada
consulta implicar siempre recorrer prcticamente 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 todava, 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 clasulas 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 ndice no se usar. Por ejemplo, supongamos que tenemos un
ndice USUARIO (ID, NOMBRE, DIRECCION), y una clusula SELECT ...
WHERE NOMBRE = x. Este select no aprovechar el ndice. Tampoco lo hara
un SELECT ... WHERE ID =x AND DIRECCION = y. Cualquier consulta que
incluya una columna parte del ndice sin incluir adems las columnas a su
izquierda, no usar el ndice. Por tanto en nuestro ejemplo solo sacaran
provecho del ndice las consultas SELECT ... WHERE ID = x, o WHERE ID = X
AND NOMBRE = y o WHERE ID = x AND NOMBRE = y AND DIRECCION =
Z.

La creacin de ndices tambin 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 sern
frecuentes operaciones de escritura (INSERT, UPDATE, DELETE).
Tampoco tendra 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 pequeas, 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, tambin se pueden crear en la parte de definicin de columnas.

Claves primarias

La sintaxis para definir claves primarias es:

definicin_columnas| PRIMARY KEY (index_nombre_col,...)

El ejemplo anterior que vimos para crear claves primarias, usando esta sintaxis,
quedara as:

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


NULL DEFAULT 5000, PRIMARY KEY (nombre));

Pero esta forma tiene ms opciones, por ejemplo, entre los parntesis 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.
CREATE TABLE mitabla2 (id INT, nombre CHAR(19),INDEX (nombre));

O su equivalente:

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

Tambin podemos crear un ndice sobre parte de una columna:

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

Este ejemplo usar slo los cuatro primeros caracteres de la columna 'nombre'
para crear el ndice.

Se pueden aadir ndices a una tabla despus de creada con la sentencia ALTER
TABLE:

ALTER TABLE nombre_tabla ADD INDEX nombre_indice


(columna_indexada);

Para eliminar un ndice usamos tambin ALTER TABLE:

ALTER TABLE nombre_tabla DROP INDEX nombre_indice.

ndices nicos

El tercero permite definir ndices con claves nicas, tambin sobre una columna,
sobre varias o sobre partes de columnas. Para definir ndices con claves nicas se usa la
opcin UNIQUE. La diferencia entre un ndice nico y uno normal es que en los nicos
no se permite la insercin de filas con claves repetidas. La excepcin 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
Se usan en tablas del tipo MyISAM, que veremos un poco ms adelante qu tipo
de tablas son, y pueden contener uno o ms campos del tipo CHAR, VARCHAR y TEXT.

Un ndice de texto completo est diseado para facilitar y optimizar la bsqueda


de palabras clave en tablas que tienen grandes cantidades de informacin en campos de
texto.

Las bsquedas de texto completo son ejecutadas con la funcin MATCH( ). Esta
funcin ejecuta la bsqueda de una cadena en una coleccin de texto (un conjunto de
una o ms columnas incluidas en un ndice FULLTEXT). La cadena que se busca es
dada como un argumento en la funcin AGAINST( ), y es ejecutada en modo no
sensitivo, es decir, no importa el uso de maysculas y minsculas.

Veamos algunos ejemplos de la utilizacin de ndices Full-Text:

CREATE TABLE artculos ( 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 artculo se explica como combinar las ...');

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


MySQL', 'Los detalles del almacenamiento y recuperacin de ...');

INSERT INTO articulos VALUES (0,'Tutorial bsico 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 artculo se explican los detalles del manejo ...');

INSERT INTO articulos VALUES (0,'MySQL bajoMSWindows', 'A continuacin


se explica el procedimiento de ...');

SELECT id, titulo, contenido FROM artculos 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 artculos WHERE MATCH


(titulo,contenido) AGAINST ('MySQL');
Igual que la anterior, pero no devuelve nada. La razn es que las palabras que
aparecen en ms de un 50% de los casos se consideran palabras que hacen ruido y no
se tienen en cuenta.

SELECT id, titulo, contenido FROM artculos WHERE MATCH


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

Se puede incluir en la bsqueda ms de una palabra. En este caso buscamos filas


que contengan las palabras Java o Visual. Al invertir el orden de las palabras de
bsqueda se obtiene el mismo resultado.

SELECT id, titulo, contenido FROM artculos 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 estn relacionados, pero tambin pueden ser creados de forma independiente
con CREATE INDEX:

CREATE [UNIQUE|FULLTEXT] INDEX index_name ON tbl_name


(index_col_name,...)

Claves forneas
En MySQL slo existe soporte para claves forneas en tablas de tipo InnoDB.
Sin embargo, esto no impide usarlas en otros tipos de tablas.

La diferencia consiste en que en esas tablas no se verifica si una clave fornea


existe realmente en la tabla referenciada, y que no se eliminan filas de una tabla con una
definicin de clave fornea. Para hacer esto hay que usar tablas InnoDB.

Hay dos modos de definir claves forneas en bases de datos MySQL.

El primero, slo sirve para documentar, y no define realmente claves forneas.


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

CREATE TABLE personas (id INT AUTO_INCREMENT PRIMARY KEY,


nombre VARCHAR(40), fecha DATE);

CREATE TABLE telefonos (numero CHAR(12), id INT NOT NULL


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

Hemos usado una definicin de referencia para la columna 'id' de la tabla


'telefonos', indicando que es una clave fornea correspondiente a la columna 'id' de la
tabla 'personas' (1). Sin embargo, aunque la sintaxis se comprueba, esta definicin no
implica ningn comportamiento por parte de MySQL.

La otra forma es mucho ms til, aunque slo se aplica a tablas InnoDB.

En esta forma no se aade la referencia en la definicin de la columna, sino


despus de la definicin de todas las columnas. Tenemos la siguiente sintaxis resumida:

CREATE TABLE nombredefinicin_de_columnas FOREIGN 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 definicin de claves forneas


quedar as:

CREATE TABLE personas2 (id INT AUTO_INCREMENT PRIMARY KEY,


nombre VARCHAR(40), fecha DATE)ENGINE=InnoDB;

CREATE TABLE telefonos2 (numero CHAR(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 definicin de clave fornea


est indexada (2). Pero esto no debe preocuparnos demasiado, ya que si no lo hacemos
de forma explcita, MySQL lo har por nosotros de forma implcita.

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

ON DELETE <opcin>, indica que acciones se deben realizar en la tabla actual


si se borra una fila en la tabla referenciada.

ON UPDATE <opcin>, es anlogo pero para modificaciones de claves.

Existen cinco opciones diferentes. Veamos lo que hace cada una de ellas:

RESTRICT: esta opcin impide eliminar o modificar filas en la tabla


referenciada si existen filas con el mismo valor de clave fornea.
CASCADE: borrar o modificar una clave en una fila en la tabla referenciada con
un valor determinado de clave, implica borrar las filas con el mismo valor de
clave fornea o modificar los valores de esas claves forneas.
SET NULL: borrar o modificar una clave en una fila en la tabla referenciada con
un valor determinado de clave, implica asignar el valor NULL a las claves
forneas con el mismo valor.
NO ACTION: las claves forneas no se modifican, ni se eliminan filas en la tabla
que las contiene.
SET DEFAULT: borrar o modificar una clave en una fila en la tabla referenciada
con un valor determinado implica asignar el valor por defecto a las claves
forneas con el mismo valor.

Por ejemplo, veamos esta definicin de la tabla 'telefonos':

CREATE TABLE telefonos3 (numero CHAR(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 si existen filas en la tabla 'telefonos3' con mismo valor en la columna
'id'. La fila de 'personas' no se eliminar, a no ser que previamente eliminemos las filas
con el mismo valor de clave fornea en'telfonos3'.Si se modifica el valor de la columna
'id' en la tabla 'personas', se modificarn los valores de la columna 'id' para mantener la
relacin.

Veamos un ejemplo ms prctico. 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 filas en '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 quedaran entonces con los siguientes valores:

personas:

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

telefonos:

12322132 1
12332221 1
55546545 4
55565445 4

3. Motor de almacenamiento

El servidor MySQL incorpora una caracterstica nica llamada "motores de


almacenamiento", que nos permite seleccionar el tipo de almacenamiento interno de
cada tabla, en base al que mejor se adece a una situacin particular.

Dicha seleccin, la hace el desarrollador a nivel de tabla, y no afecta a la manera


en que el servidor interacta con el cliente: los comandos SQL sern los mismos sea
cual sea el motor de almacenamiento escogido. El cliente no necesita saber cmo se
guardan los datos.

Al disear una base de datos con MySQL ser necesario decidir qu motores de
almacenamiento vamos a utilizar.

MySQL dispone de una docena de motores de almacenamiento propios, ms los


motores externos desarrollados por terceras partes que se pueden incorporar al servidor.

Los ms importantes son:

ISAM: Motor original de MySQL.


MyISAM: Es el motor por defecto. Es muy rpido pero no transaccional.
Reemplaza a ISAM.
InnoDB: Tablas de transaccin segura con bloqueo de fila y claves forneas.
Memory (Heap): Es una tabla MyISAM, pero almacenada en memoria, no
endisco. Es todava ms rpida.
MERGE o MRG_MyISAM: Una coleccin de tablas MyISAM usadas como una
nica tabla.
BerkeleyDB o BDB: Tablas de transaccin segura con bloqueo de pgina.

Generalmente usaremos tablas MyISAM o tablas InnoDB.

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


La decisin correcta depende en gran parte del uso futuro que tendr la base de datos. Y
eso, suele ser difcil saberlo con exactitud durante el diseo.

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


Transacciones y concurrencia: Si vamos a necesitar transacciones y alta
concurrencia de usuarios, probablemente InnoDB ser la mejor opcin. Es decir,
que obtendremos mejores condiciones de rendimiento si las tablas que se vayan
a ver involucradas frecuentemente en consultas transacciones y que sufran una
alta concurrencia de usuarios se basan en el motor InnoDB. Si la concurrencia
no es tan alta, pero seguimos necesitando transacciones, tanto InnoDB como
BDB pueden ser la solucin. El motor MyISAM no soporta transacciones. Pero si
no las necesitamos, MyISAM ser con toda probabilidad la mejor opcin.
Copias de seguridad: La realizacin de copias de seguridad tambin condiciona
la eleccin de tablas. Si podemos detener peridicamente la base de datos para
realizarlas, cualquier motor servir. Pero si debemos realizarlas en caliente la
eleccin ser mucho ms complicada.
Caractersticas especiales: Por ltimo, las caractersticas especiales de nuestra
aplicacin pueden obligarnos a recurrir a un tipo determinado de motor de
almacenamiento. En concreto, si nuestra aplicacin depende de la capacidad
para contar rpidamente el nmero de registros de una tabla (SELECT
COUNT(*) FROM) recurriremos a MyISAM, que siempre sabe cuntos registros
tiene sin necesidad de contarlos. Sin embargo, InnoDB debe realizar la cuenta.
As mismo, recurriremos a MyISAM si necesitamos realizar eficientemente
bsquedas por texto completo (WHERE notas LIKE '%...).Pero sin embargo,
InnoDB ser la solucin en los casos en los que necesitemos disponer de
integridad referencial.

La parte final de la sentencia CREATE TABLE permite 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 caractersticas de
tablas.

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


por ejemplo:

SHOW COLUMNS FROM gente;

Tambin podemos ver la instruccin usada para crear una tabla, mediante la
sentencia SHOW CREATE TABLE:
SHOW CREATE TABLE gente;

5. Eliminacin de tablas

A veces es necesario eliminar una tabla, ya sea porque es ms 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 aadir las palabras IF EXISTS para evitar errores si la tabla a eliminar
no existe.

DROP TABLE IF EXISTS ciudad6;

6. Eliminacin de la base de datos


De modo parecido, se pueden eliminar bases de datos completas, usando la
sentencia DROP_DATABASE nombre_base_de_datos.

La sintaxis tambin es muy simple. Hay que tener cuidado, ya que al borrar
cualquier base de datos se elimina tambin cualquier tabla que contenga.

DROP DATABASE IF EXISTS biblioteca;

EJERCICIOS

1. 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:
Identificador MEDIUMINT UNSIGNED
Latitud VARCHAR(14)
Longitud VARCHAR(15)
Altitud MEDIUMINT

Muestra:
IdentificadorEstacion MEDIUMINT UNSIGNED
Fecha DATE
TemperaturaMinimaTINYINT
TemperaturaMaxima TINYINT
Precipitaciones SMALLINT UNSIGNED
HumedadMinima TINYINT UNSIGNED
HumedadMaxima TINYINT UNSIGNED
VelocidadVientoMinima SMALLINT UNSIGNED
VelocidadVientoMaxima SMALLINT UNSIGNED

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


Muestra sern las columnas IdentificadorEstacion, Fecha. Definir todas estas columnas
cmo no nulas.

Aadir un ndice al campo IdentificadorEstacion de la tabla Muestra y poner cmo


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 actualizacin.

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

2. Crear la base de datos biblio 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)

TrataSobre (ClaveLibro, ClaveTema)

EscritoPor (ClaveLibro, ClaveAutor)


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

Libro: La clave primaria ser ClaveLibro. Aadir un ndice en el campo


ClaveEditorial. ClaveEditorial es clave ajena de la tabla Editorial. Usar las opciones
SET NULL para borrado y CASCADE para modificacin. 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 modificacin y borrado. Utilizar el motor de almacenamiento InnoDB.

ClaveLibro INT
NumeroOrden SMALLINT
Edicion SMALLINT
Ubicacion VARCHAR(15)

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 modificacin. ClaveLibro es
clave ajena de la tabla Ejemplar. Usar las opciones SET NULL para borrado y
CASCADE para modificacin. 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 modificacin. ClaveTema es clave ajena de la tabla Tema. Usar las
opciones CASCADE para borrado y modificacin. 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 modificacin. ClaveAutor es clave ajena de la tabla Autor. Usar las
opciones CASCADE para borrado y modificacin. Utilizar el motor de almacenamiento
InnoDB.

ClaveLibro INT
ClaveAutor INT

También podría gustarte