Está en la página 1de 38

UT6.

CREACIÓN DE
BASES DE DATOS
LENGUAJE DE DESCRIPCIÓN DE DATOS (DDL)

1
Orígenes
Tras la exposición del modelo relacional por parte de E.F. Codd en 1970, dos
compañeros del IBM Research Center, Donald D.Chamberlin y Raymond F.Boyce,
Introducción al definieron cuatro años más tarde un lenguaje de programación gracias al que
interactuar con la información contenida en una base de datos.

lenguaje SQL Dada la similitud de dicho lenguaje con la lengua cotidiana, lo llamaron SEQUEL
(structured English query language, lenguaje de consulta estructurado en inglés).
Debido a problemas de copyright, el nombre se cambió a SQL.

SQL es un lenguaje de alto nivel con el que comunicarse con un SGBD.

No solamente sirve para realizar consultas, altas, modificaciones y borrado de datos,


sino también para definir la estructura de la base de datos, declarar sus objetos y
elementos (usuarios, perfiles, backups, temporizaciones) y establecer elementos de
seguridad.

En la actualidad SQL es el estándar de la inmensa mayoría de los SGBD comerciales.


Nota: Puedes consultar más sobre la historia de SQL en
https://es.wikipedia.org/wiki/SQL

2
Normativas y versiones
No existe una única versión del lenguaje SQL. Muchos fabricantes de software han
desarrollado extensiones del conjunto de comandos básico o variaciones concretas

Introducción al que llamaremos dialectos, pero existe un conjunto de normas básicas que todos
deben cumplir, así que la mayoría de ellos son compatibles con la normativa actual.

lenguaje SQL Las normativas pretenden evitar que cada fabricante saque al mercado sus propias
versiones. Estas estandarizaciones están a cargo de la organización ISO (International
Standarization Organization). Tenemos las siguientes normativas:

 SQL-86: contiene la funcionalidad mínima para que un lenguaje se considere SQL.


 SQL-89: añade instrucciones para gestionar las claves ajenas (reglas de integridad
referencial).
 SQL-92: contiene una gran cantidad de variaciones sobre el original.
 SQL:1999: se añaden extensiones hacia la programación orientada objetos.
 SQL:2003. Se han introducido características de SQL/ XML.
 A partir de aquí ha habido nuevas normativas en 2006 y 2008, etc.; pero
trataremos de la parte comúnmente asumida como estándar actual que es el
SQL:2003.

3
Tipos de sentencias SQL
Este lenguaje tiene sentencias que se utilizan en tareas muy variadas. Dependiendo de estas tareas, las
sentencias SQL se clasifican en:

 LDD (Lenguaje de Definición de Datos)


 Incluye sentencias para gestionar las estructuras.
 LMD (Lenguaje de Manipulación de Datos)
 Incluye sentencias para gestionar los datos.
 LCD (Lenguaje de Control de Datos)
 Incluye sentencias para gestionar la seguridad y los
permisos.
 LCT (Lenguaje de Control de Tansacciones)
 Administran las modificaciones creadas por las
instrucciones LMD.

4
Tipo de valor Contenido Tipos de datos
Alfanuméricos
Contienen cifras y letras. Presentan una longitud limitada (255
caracteres). en SQL
Existen de varios tipos, principalmente: enteros (sin decimales) y  Cada base de datos introduce
Numéricos
reales (con decimales).
tipos de valores de columna
Booleanos Poseen dos formas: Verdadero y falso (Sí o No). que no necesariamente están
Almacenan fechas facilitando posteriormente su explotación. De presentes en otras.
Fecha y hora esta forma se posibilita ordenar los registros por fechas o calcular
los días entre una fecha y otra.  Sin embargo, existe un
conjunto de tipos que están
Memos
Son campos alfanuméricos de longitud ilimitada. Presentan el representados en la totalidad
inconveniente de no poder ser indexados.
de estas bases.
Son campos numéricos enteros que incrementan en una unidad su
Autoincrementables valor para cada registro incorporado.
Sirven de identificador ya que resultan exclusivos de un registro.

5
Comentarios en SQL
Utilizaremos comentarios para describir el propósito y funcionamiento de un bloque de código o consulta.
También se pueden usar para anular líneas de código.
Pueden ser de 2 tipos:
 De bloque: comienzan por /* y terminan por */
 De línea: comienzan por – (guión guión) y terminan cuando finaliza la línea.

No olvides dejar un espacio


entre el último guión y la
primera palabra

6
PostgreSQL vs MySQL
 PostgreSQL y MySQL son dos de los sistemas de gestión de bases de
datos de código abierto más utilizados.

 Tanto PostgreSQL como MySQL permiten trabajar con bases de


datos relacionales. Ambos sistemas entienden los comandos SQL
que permiten crear, modificar y llenar tablas, así como realizar
consultas.

 Mientras que MySQL es un sistema de gestión de bases de datos  A partir de aquí vamos a estudiar
puramente relacional (RDBMS), PostgreSQL es un DBMS relacional MySQL.
de objetos (ORDBMS). Así pues, PostgreSQL soporta una serie de
conceptos conocidos de la programación orientada a objetos. Entre  Para ello utilizaremos la herramienta
MySQL Workbench
ellos se encuentran los tipos de datos definidos por el usuario, los
tipos de datos compuestos y la herencia. PostgreSQL es más potente  Es la herramienta gráfica oficial
que MySQL, pero también más complejo. de MySQL para gestionar y/o crear
bases de datos

7
Tipos de datos de cadena
Los tipos que se utilizan en MySQL para almacenar datos alfanuméricos son

Tipo Descripción Rango Almacenamiento

Cadena de longitud fija.


CHAR(N) De 1 a 255 caracteres N bytes
Se rellena con espacios.

VARCHAR(N) Cadena de longitud variable. De 1 a 255 caracteres L+1 bytes

TINYBLOB Pequeño valor BLOB L < 28 L+1 bytes


BLOB BLOB Normal L < 216 L+2 bytes
MEDIUMBLOB BLOB Medio L < 224 L+3 bytes
LONGBLOB BLOB Grande L < 232 L+4 bytes

TINYTEXT Pequeño valor TEXT L < 28 L+1 bytes


TEXT TEXT Normal L < 216 L+2 bytes
MEDIUMTEXT TEXT Medio L < 224 L+3 bytes
LONGTEXT TEXT Grande L < 232 L+4 bytes

ENUM(“valor1”, “valor2”,...) Se le asigna un valor del conjunto enunciado Número máximo de valores: 65.535 1 ó 2 bytes

SET(“valor1”,”valor2”,...) Se le asigna 0 o más valores del conjunto Número máximo de valores: 64 1,2,3,4, u 8 bytes

L: longitud que ocupa la cadena


N: número máximo de caracteres que puede tener la cadena 8
Características de los tipos de datos de cadena
CHAR Y VARCHAR TINYTEXT
 Se diferencian en que CHAR es de longitud fija y VARCHAR de
longitud variable.  Se comporta igual que VARCHAR pero el acceso
a VARCHAR es más rápido, por eso es más aconsejable.
 No pueden mezclarse en la misma tabla columnas de longitud
fija y variable, por tanto CHAR no puede mezclarse con BLOB
columnas VARCHAR, BLOB o TEXT. En este caso se convierten
las columnas CHAR a VARCHAR.  Se trata de un objeto binario largo que puede albergar todo
lo que se quiera.
 Se pueden mezclar columnas CHAR menores de cuatro
caracteres y VARCHAR, sin que se cambien todas a VARCHAR.  Se utilizan para almacenar documentos de procesamiento
Si todas las columnas son cortas se convierten todas de textos, imágenes y sonidos, etc.
automáticamente a CHAR para optimizar el almacenamiento.
ENUM y SET
 Cuando los valores no varían mucho de longitud es
mejor CHAR porque se procesan de forma más eficiente.  Son tipos de cadena en las que los valores se deben elegir
Recuerda especificar la longitud, de lo contrario se asumirá un de un conjunto fijo de cadenas.
único carácter.  Se diferencian en que los valores ENUM deben elegir un
TEXT miembro del conjunto de valores, mientras que los
valores SET pueden estar formados por alguno o todos los
 Permite definir cadenas de longitud variable. Entre paréntesis miembros del conjunto
se pone la máxima longitud que puede tener la cadena.

9
Atributos para columnas de tipo cadena
BINARY
 Se puede especificar para los tipos CHAR y VARCHAR con el fin de que los valores de las columnas sean tratados como
cadenas binarias.
NULL / NOT NULL
 Para cualquier tipo de cadena. Por defecto es NULL.
 El valor NOT NULL es diferente de la cadena vacía.
 Para evitar una cadena vacía es necesario preverlo en las aplicaciones.
DEFAULT
 Para especificar un valor predeterminado, excepto en BLOB y TEXT.

10
Tipos de datos numéricos
Rango de valores Almacenamiento
Tipo de datos Descripción
Con signo Sin signo requerido

TINYINT[(N)] Entero muy pequeño -128 a 127 0 a 255 1 byte

SMALLINT[(N)] Entero pequeño -32.768 a 32.767 0 a 65.535 2 bytes

MEDIUMINT[(N)] Entero mediano -8.388.608 a 8.388.607 0 a 16.777.215 3 bytes

INT[(N)]
Entero estándar -2.147.683.648 a 2.147.483.647 0 a 4.294.967.295 4 bytes
INTEGER[(N)]

-9.223.372.036.854.775.808 0a
BIGINT[(N)] Entero largo a 8 bytes
9.223.372.036.854.775.807 18.446.744.073.709.551.615

Número pequeño de simple precisión de Valor mínimo distinto de 0 Valor máximo distinto de 0
FLOAT[(N,D)] 4 bytes
coma flotante ±1,175.494.351E-38s ±3,402.823.466E+38s

Valor mínimo distinto de 0 Valor máximo distinto de 0


DOUBLE[(N,D)] Número grande de doble de precisión de
±2,2.250.738.585.072.014 ±1,7.976.931.348.623.157 8 bytes
REAL[(N,D)] coma flotante
E-308 E+308

DECIMAL[(N[,D])]
Número de coma flotante, representado
NUMERIC[(N[,D])] Varios, el rango depende de N y D N+2 bytes
como una cadena
DEC[(N[,D])]

N : Tamaño máximo de pantalla (precisión)


D : Número de decimales (escala) 11
Atributos para columnas de tipo numérico
ZEROFILL
 Hace que los valores mostrados en pantalla se rellenen con ceros a la izquierda hasta ocupar el ancho asignado a dicho valor.
 Al especificar "zerofill" a un campo numérico, se coloca automáticamente el atributo "unsigned".
 Cualquier valor negativo ingresado en un campo definido "zerofill" es un valor inválido.

NULL / NOT NULL


 Si no se especifica, el valor predeterminado es NULL.

DEFAULT
 Sirve para especificar el valor predeterminado. Si no se especifica, se elige un valor automáticamente.
 Para los tipos de columna numérica es NULL, si no puede contener este valor, el valor por defecto sería 0.

Atributos para columnas de tipo numérico entero


AUTO_INCREMENT UNSIGNED
 Para generar identificadores únicos o valores en serie.  Rechaza los valores negativos
 Normalmente comienzan por 1 y aumentan en 1 por cada fila.
 Se aplica sólo a columnas de tipo entero.

12
Tipos de datos de fecha/hora
Tipo Descripcion Rango Almacenamiento

“1000-01-01”
Representa una fecha en formato
DATE a 3 bytes
‘AAAA-MM-DD’
“9999-12-31”

Representa una hora en formato:


TIME “-838:59:59” a “838:59:59” 3 bytes
‘HH:MM:SS’

Representa una combinación de fecha y hora “1000-01-01 00:00:00”


DATETIME en formato: a 8 bytes
‘AAAA-MM-DD HH:MM:SS’ “9999-12-31 23:59:59”

Representa una combinación de fecha y hora 19700101000000


TIMESTAMP en formato: a 4 bytes
‘AAAAMMDD HHMMSS’ cualquier fecha del año 2037

Representa un año en formato:


YEAR[(2|4)] ‘AA’ o ‘AAAA’. 1901 a 2155 1 byte
Por defecto lo representa con 4 dígitos

13
Características de los tipos de datos fecha/hora
TIME Y DATETIME
 La diferencia entre TIME y DATETIME es que en DATETIME la hora es una hora del día y TIME representa el tiempo
transcurrido.
 Es necesario especificar los segundos. Las 12:30 son 00:12:30 en lugar de las 12:30:00
TIMESTAMP
 Representan valores en formato “AAAAMMDDhhmmss”. Se utilizan para grabar un registro que se crea o se modifica.
YEAR
 Se utiliza para almacenar el año en lugar de una fecha completa.

Atributos para columnas de tipo fecha y hora


 No existen atributos específicos.
 Pueden especificarse: NULL, NOT NULL, DEFAULT.

14
Sintaxis para Símbolo Descripción

escribir Mayúsculas
Una palabra en mayúsculas refleja una palabra reservada de SQL y por
tanto hay que escribirla tal y como aparece en la sintaxis.
instrucciones Minúsculas
Una palabra en minúsculas es algo variable y hay que sustituirla por

en SQL un dato concreto.


Los corchetes se utilizan para reflejar que las alternativas que
Símbolos que se utilizan []
contienen son opcionales.
Por tanto toda palabra no encerrada entre corchetes debe ser incluida
para describir cada una de obligatoriamente en la sentencia.
las instrucciones que se |
La barra vertical sirve para separar opciones alternativas en una lista.
pueden utilizar en MySQL. Solo se puede usar una de ellas.
Cuando una lista separada con barras se encierra
[|] entre corchetes indica que se puede elegir entre estos valores
opcionalmente.
Si una lista se encierra entre llaves, igual que pasa con los corchetes,
{} indica que sus valores se pueden elegir, pero es necesario elegir uno
de ellos.

Varias palabras separadas por comas y finalizadas con puntos


… suspensivos significan que se puede usar un número variable de esos
datos y siempre separados con comas.
15
Sintaxis para escribir instrucciones en SQL
Ejemplo

SELECT [ALL | DISTINCT] columna1 [, columna2, columna3,.......] | * FROM tabla1 [, tabla2, tabla3, ….]
[WHERE condición ] [ORDER BY expr1 [DESC | ASC] [, expr2 [DESC | ASC] ....]

Recuerda
En el siguiente enlace puedes consultar todas las restricciones y la sintaxis completa de la sentencia CREATE TABLE
 Los símbolos no tienen porqué formar parte de las instrucciones.
 Los corchetes se utilizan para reflejar que algo es opcional pero los corchetes en sí nunca forman parte de una
sentencia SQL. Lo mismo ocurre con las llaves. Sin embargo los paréntesis forman parte de la propia sentencia SQL y
hay que incluirlos.
 En el caso de las mayúsculas, las utilizamos en la descripción para reflejar que esa palabra es una sentencia SQL y hay
que escribirla así, pero podríamos hacerlo en minúsculas. Lo mismo ocurre con las minúsculas, corresponden a
nombres de columnas, de tablas, o de otros objetos que puedo definir como mayúsculas o como minúsculas.

En el siguiente enlace puedes consultar todas las restricciones y la sintaxis completa de la sentencia CREATE TABLE
16
Representación de valores en los principales tipos de datos
 Valor de tipo carácter o cadena de caracteres, se  Los reales pueden representarse con signo. Como separador
representa entre comillas simples o dobles. En las entre parte entera y fraccionaria se usa el punto. Puede usarse
comparaciones entre valores tipo cadena de la representación exponencial. Son representaciones reales
caracteres no se distingue entre mayúsculas y válidas:
minúsculas.  56
 -89.008
 “SANTANDER”
 3.1089E+24
 “Y”
 ‘n’
 ‘123’  Las fechas se representan entre comillas y en formato
 Los enteros pueden representarse con signo. Son numérico usando como separador el guión (Año-Mes-Día).
Por ejemplo, el 17 de enero de 2011 se representa como
representaciones enteras válidas:
“2011-01-17” en tipo Date.
 +78
 78
 -78  Las horas (datos de tipos TIME) se representan entre
comillas y usando como separador el carácter dos puntos.
Por ejemplo, para representar las 4 y 20 de la tarde:
 Los datos de tipo lógico o booleano sólo admiten dos “16:20:00”
valores: true y false.

17
Lenguaje de definición de datos (DDL)
Es la parte del SQL que más varía de un SGBD a otro. Esto se debe a que cada sistema organiza internamente
los datos de una forma particular.

Con este lenguaje crearemos y modificaremos, tanto los objetos de la base de datos (creación de tablas,
modificación de la estructura de tablas, eliminación de tablas, etc) como de la propia base de datos.

Las sentencias a utilizar son:


 CREATE: se utiliza para crear objetos como bases de datos, tablas, vistas, índices, triggers y procedimientos
almacenados.
 DROP: se utiliza para eliminar los objetos de la base de datos.
 ALTER: se utiliza para modificar los objetos de la base de datos.
 SHOW: se utiliza para consultar los objetos de la base de datos.
 USE: se utiliza para indicar la base de datos con la que trabajar.
 DESCRIBE: se utiliza para mostrar información sobre la estructura de una tabla.

18
Sentencias a nivel de base de datos
 Crear una base de datos  Borrar una base de datos
Para crear una base de datos nueva escribimos: Con la siguiente sentencia se elimina la base de
datos y todas las tablas que contenga
CREATE DATABASE NombreBaseDeDatos;
DROP DATABASE NombreBaseDeDatos;
Automáticamente se crea
 una carpeta vacía dentro de la carpeta DATA con el
mismo nombre de la base de datos.  Activar una base de datos
 las tablas que guardarán los metadatos.
Para convertir una base de datos en la base de
 Consultar el listado de bases de datos datos activa:
disponibles
USE NombreBaseDeDatos;
SHOW DATABASES;
A partir de este momento cualquier comando
Muestra un listado con todas las bases de datos a las que se ejecute se referirá a la base de datos que
que tiene acceso el usuario conectado a MySQL acabamos de activar.

19
Creación de tablas
La sentencia base que sirve para crear tablas es CREATE TABLE. A partir de ahí, debemos especificar
 El nombre que le queremos asignar a la tabla.
 Los nombres de las columnas y todas las opciones que admite cada columna.
 Otras características a nivel de tabla

Sintaxis general Creación de tabla CLIENTES

CREATE TABLE NombreTabla (


NombreColumna1 tipo [NOT NULL | NULL] [DEFAULT ValorPorDefecto] CREATE TABLE Clientes (
CodCliente INTEGER NOT NULL PRIMARY KEY,
[AUTO_INCREMENT]
DNI CHAR(10),
[UNIQUE [KEY] | [PRIMARY] KEY] Apellidos CHAR(25),
[REFERENCES NombreTabla [(NombreColumna)] Nombre CHAR(25),
[ON DELETE opcion ] [ON UPDATE opcion] ] | CHECK (expr) , Direccion CHAR(50),
NombreColumna2 tipo, Telefono CHAR(25)
……… );
NombreColumnaN tipo);

20
Creación de tablas - Restricciones a nivel de columna
A la hora de definir columnas, hay más opciones además del nombre y el tipo de datos, como: valor por
defecto, si puede contener o no valores nulos, crear la clave primaria, índices, etc.
A esas opciones se les denomina restricciones.
Si una misma columna tiene varias restricciones, éstas se separan con espacios (nunca con comas).
La coma se utilizará al finalizar la definición de una columna y pasar a la siguiente.

La sintaxis para definir columnas es:

NombreColumna tipo [NOT NULL | NULL] [DEFAULT ValorPorDefecto] [AUTO_INCREMENT]


[UNIQUE [KEY] | [PRIMARY] KEY] [REFERENCES NombreTabla [(NombreColumna)]
[ON DELETE opcion ] [ON UPDATE opcion] ] | CHECK (expr)

21
Creación de tablas - Restricciones a nivel de columna
NULL | NOT NULL
 Sirve para definir si la columna podrá contener o no valores nulos.
 La opción por defecto es NULL.
DEFAULT
 Sirve para definir el valor que tendrá por defecto una columna.
 Se asignará de forma automática cuando no se especifique otro valor al añadir filas.
 Cuando una columna puede contener nulos y no se especifica valor por defecto este será NULL.
AUTO_INCREMENT
 Para una columna de tipo entero.
 Si en una columna definida como auto_increment no introducimos ningún valor o introducimos un valor nulo, se
añade una unidad al valor anterior.
 Se usa sobre todo para crear una clave primaria artificial.
UNIQUE KEY
Indica que el valor de la columna es único y no pueden aparecer dos valores iguales en la misma columna.
PRIMARY KEY
 Indica que una columna o varias son clave primaria.
 La clave primaria nunca puede tener valores NULL. Si no lo especificamos MySQL lo hace de forma automática .

22
Creación de tablas - Restricciones a nivel de columna
INDEX
 Indica que la columna es un índice y por tanto su contenido se almacena en una tabla de índices que agiliza
las operaciones de búsqueda sobre las tablas.
UNIQUE
 Indica que la columna es un índice que no admite repeticiones en los datos que se introduzcan en esa
columna.
REFERENCES:
 Se usa para especificar que esa columna es clave ajena que referencia a una columna que es clave primaria
en otra tabla.
 A continuación se puede definir lo que se hará en la tabla en caso de que se borre o modifique la clave
primaria de la tabla relacionada.
CHECK
 Indica que los valores introducidos en la columna deben cumplir una determinada condición.

23
Creación de tablas - Restricciones a nivel de columna
Ejemplo: Creación de la tabla Pieza

CREATE TABLE Pieza (


id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
color VARCHAR(50) NOT NULL,
precio DECIMAL(7,2) NOT NULL CHECK (precio > 0);

Nota: Aunque puede hacerse, las restricciones de tipo PRIMARY KEY, REFERENCES, INDEX, y
UNIQUE no suelen definirse como restricciones a nivel de columna sino como otro tipo de
restricciones que veremos a continuación.

24
Creación de tablas – Restricciones de tipo 2
No podemos definir una clave compuesta con las restricciones anteriores, ya que no podemos asignar
la PRIMARY KEY a dos columnas porque se interpretaría como dos claves principales.
Veremos cómo definir restricciones sobre cualquier columna individual o sobre conjuntos de columnas que
se hayan definido en las líneas anteriores. Al ser una sintaxis más general, utilizaremos este tipo de
restricciones.
En la siguiente página tienes la sintaxis simplificada de la sentencia CREATE TABLE con las restricciones de
este tipo

25
Creación de tablas – Restricciones de tipo 2
Sintaxis general Creación de tabla CLIENTES

CREATE TABLE NombreTabla (


NombreColumna tipo [NOT NULL | NULL] [DEFAULT ValorPorDefecto] CREATE TABLE Clientes (
[AUTO_INCREMENT] CodCliente INT(4) NOT NULL AUTO_INCREMENT,
[UNIQUE [KEY] | [PRIMARY] KEY] DNI VARCHAR(9) NOT NULL,
[REFERENCES NombreTabla [(NombreColumnaIndice)]
Apellidos VARCHAR(50),
[ON DELETE opcion ] [ON UPDATE opcion] ] | CHECK (expr) ,
NombreColumna2 tipo2 ..., Nombre VARCHAR(25),
... Direccion VARCHAR(50),
NombreColumnaN tipoN ..., Poblacion VARCHAR(25) DEFAULT "Santander",
| PRIMARY KEY (NombreColumnas,…)
Telefono VARCHAR(9),
| KEY [NombreIndice ] (NombreColumnas,…)
| INDEX [NombreIndice] (NombreColumnas,…) PRIMARY KEY (CodCliente),
| UNIQUE [INDEX] [NombreIndice] UNIQUE KEY (DNI)
[TipoIndice](NombreColumnasIndice,…) );
);

26
Creación de tablas - Restricciones de tipo 2
PRIMARY KEY
 Tanto si la clave está formada por una sola columna como, obligatoriamente, cuando esté formada por
más de una columna (claves compuestas) es otra alternativa para especificar la clave principal después
de definir las columnas.
 Todos los atributos de la clave primaria (PRIMARY KEY), han de contener valores no nulos (NOT NULL).
KEY e INDEX
• Además de la clave primaria tenemos otro tipo de índice para ser definido sobre una columna, sobre
varias o sobre partes de columnas.
• Un índice se debe definir para aquellas columnas que se usen frecuentemente. Las opciones KEY o
INDEX se usan indistintamente. El nombre del índice es opcional.
UNIQUE
 Permite definir índices con valores únicos. No admite añadir filas con valores repetidas (excepto NULL,
que sí se puede repetir). Puede definirse sobre una columna, sobre varias o sobre partes de columnas.
 Puede haber más de un índice UNIQUE en una tabla.
 Se definen sobre todo sobre columnas que representan claves alternativas.

27
Creación de tablas – Restricciones de tipo 3
FOREIGN KEY
Este tipo de restricción indica que las columnas indicadas entre paréntesis forman una clave ajena relativa a las
columnas de otra tabla que se indica tras la palabra REFERENCES.

CREATE TABLE NombreTabla (


NombreColumna tipo restricciones tipo columna ,
NombreColumna2 tipo2 ...,
...
NombreColumnaN tipoN ...,
restricciones tipo 2
| [CONSTRAINT [simbolo]] FOREIGN KEY [NombreClaveAjena]
(NombreColumnas,...) REFERENCES NombreTabla(NombreColumnas,..)
[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION] | SET DEFAULT
[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION] | SET DEFAULT
| CHECK (expr)
);

28
Creación de tablas – Restricciones de tipo 3
 Los nombres de símbolo y de la clave ajena NombreClaveAjena son opcionales.
 El NombreTabla es la tabla a la que hace referencia la clave ajena y las opciones ON DELETE y ON
UPDATE expresan las opciones de borrado y de eliminación en la tabla que estamos creando si se intenta
modificar o eliminar filas en la tabla principal que están relacionadas con estas.
Las opciones pueden ser:
o CASCADE: Borrado o modificación en cascada.
o RESTRICT: Borrado o modificación restringido. Significa que no se puede realizar la acción si hay filas
relacionadas en la tabla secundaria.
o SET NULL: Borrado o modificación con puesta a nulos.
o NO ACTION: Borrado o modificación sin acción. Esta es la opción por defecto.
o CHECK: Establece una condición que se debe cumplir para los valores insertados en la tabla. Esta
restricción se puede poner al crear las tablas, pero no tiene efecto, es decir, el servidor no valida los
datos afectados por esta restricción. Se admite CHECK por compatibilidad con otros sistemas.

29
Opciones a tener en cuenta en la creación de tablas
A continuación se identifican algunas de las opciones que podemos indicar durante la creación de las tablas:
 AUTO_INCREMENT: Aquí podemos indicar el valor inicial que vamos a usar en el campo definido como
AUTO_INCREMENT.
 CHARACTER SET: Especifica el set de caracteres que vamos a utilizar en la tabla.
 COLLATE: Especifica el tipo de cotejamiento que vamos a utilizar en la tabla.
 ENGINE: Especifica el motor de almacenamiento que vamos a utilizar para la tabla. Los más habituales en
MySQL son InnoDB y MyISAM. Por defecto las tablas se crean con el motor InnoDB
Para conocer todas las opciones posibles podemos consultar la sintaxis de creación de tablas en la
documentación oficial de MySQL.

30
ALTER TABLE NombreTabla
Modificación de tablas | ADD [COLUMN] DefiniciónColumna [FIRST | AFTER NombreColumna]
| ADD INDEX [NombreIndice] [TipoIndice] (NombreColumnasIndice,..)
| ADD [CONSTRAINT [Simbolo] ] PRIMARY KEY [TipoIndice]
ALTER TABLE (NombreColumnasIndice,..)
| ADD [CONSTRAINT [Simbolo] ] UNIQUE [NombreIndice] [TipoIndice]
Permite modificar la estructura de una
(NombreColumnasIndice,..)
tabla: | ADD [FULLTEXT | SPATIAL] [NombreIndice] (NombreColumnasIndice,..)
 añadir una nueva columna, | ADD [CONSTRAINT [Simbolo] ] FOREIGN KEY [NombreIndice]
(NombreColumnasIndice,..) REFERENCES
 cambiar el tipo de una columna, NombreTabla(NombreColumnasIndice,…)
| DROP [COLUMN] NombreColumna
 establecer una clave primaria, | DROP PRIMARY KEY
 eliminar una columna, | DROP INDEX NombreIndice
| DROP FOREIGN KEY Simbolo
 establecer una clave ajena, | ALTER [COLUMN] NombreColumna {SET DEFAULT texto | DROP
DEFAULT}
 etc. | CHANGE [COLUMN] NombreColumna NuevaDefinicionColumna [FIRST |
La sintaxis general de esta sentencia AFTER NombreColumna]
admite muchas opciones, las más | MODIFY [COLUMN] NuevaDefinicionColumna [FIRST | AFTER
NombreColumna]
importantes son estas
| RENAME NuevoNombreTabla

31
Modificación de tablas
La mayoría de las opciones que admite ALTER TABLE las vimos en CREATE TABLE. Solo veremos ahora las que
son nuevas:
CHANGE
 Permite modificar el nombre, el tipo y las restricciones de una columna mediante lo indicado
en NuevaDefinicionColumna.
 No admite la restricción CHECK. Si no se quiere cambiar el nombre habrá que repetir dos veces el mismo
(el antiguo y el nuevo nombre).
MODIFY
 Permite modificar el tipo y las restricciones de la columna indicada en DefinicionColumna por lo indicado
en esta definición.
 No admite la restricción CHECK.
 Se diferencia de CHANGE en que con MODIFY no se puede cambiar el nombre, solo la definición.
RENAME
 Permite renombrar la tabla.

32
Modificación de tablas Realiza las siguientes modificaciones en la tabla Clientes:
Dada la tabla Cliente 1. Añade dos nuevas columnas:
a. Una para contener el código postal : entero,
CREATE TABLE Cliente ( tamaño 5, sin signo y rellenando con 0. Que no
CodCliente INT(4) NOT NULL admita nulos.
AUTO_INCREMENT, b. Otra columna para recoger el tipo de cliente: si
DNI VARCHAR(9) NOT NULL, es un particular o una empresa (solo dos valores
Apellidos VARCHAR(50), posibles: “particular” o “empresa”).
Nombre VARCHAR(25), 2. Añade un índice por apellidos. (Ten en cuenta que
Direccion VARCHAR(50), puede haber clientes que sean hermanos).
Poblacion VARCHAR(25) DEFAULT 3. Elimina el índice anterior.
"Santander", 4. Modifica la columna Direccion con los siguientes
Telefono VARCHAR(9), datos: se llamará Domicilio y será texto de tamaño 75.
PRIMARY KEY (CodCliente), 5. Elimina el valor por defecto que tiene la columna
UNIQUE KEY (DNI) Población.
); 6. Borra las columnas Telefono y Poblacion.

33
Modificación de tablas Realiza las siguientes modificaciones en la tabla Clientes:
1. Añade dos nuevas columnas:
1. ALTER TABLE Clientes
a. Una para contener el código postal : entero,
ADD COLUMN Cp INT(5) UNSIGNED ZEROFILL
NOT NULL, tamaño 5, sin signo y rellenando con 0. Que no
ADD COLUMN Tipo ENUM("Particular", admita nulos.
"Empresa"); b. Otra columna para recoger el tipo de cliente: si
2. ALTER TABLE Clientes es un particular o una empresa (solo dos valores
ADD INDEX key_1 (Apellidos); posibles: “particular” o “empresa”).
3. ALTER TABLE Clientes 2. Añade un índice por apellidos.
DROP INDEX key_1;
3. Elimina el índice anterior.
4. ALTER TABLE Clientes
CHANGE Direccion Domicilio VARCHAR(75); 4. Modifica la columna Direccion con los siguientes
datos: se llamará Domicilio y será texto de tamaño 75.
5. ALTER TABLE Clientes
ALTER Poblacion DROP DEFAULT; 5. Elimina el valor por defecto que tiene la columna
6. ALTER TABLE Clientes Población.
DROP COLUMN Telefono, 6. Borra las columnas Telefono y Poblacion.
DROP COLUMN Poblacion;

34
Eliminación de tablas
DROP TABLE
Esta instrucción elimina una o más tablas de una base de datos. La sintaxis es:

DROP TABLE [IF EXISTS] NombreTabla1, [NombreTabla2,….]

IF EXISTS
 Se utiliza para que, en caso de que la tabla no exista, la sentencia no devuelva un código de sentencia
con resultado erróneo.
 Cuando se realiza un DROP TABLE la tabla no es recuperable, tendremos que utilizar esta instrucción
con cuidado.

35
Índices
Un índice permite consultar las filas de una tabla de una forma más rápida.
Toda clave primaria es índice. Esto lo hace MySQL automáticamente en el momento de creación de la clave
primara.

Ventajas y desventajas:
• Aunque un índice permite consultar de forma más rápida la tabla, las operaciones de añadir filas,
modificar filas o eliminar filas consumen más tiempo.
• Los datos de una tabla en la que se definen índices ocupan más espacio que el dedicado exclusivamente a
esos datos, puesto que necesita un espacio adicional para almacenar una tabla de índices.

No es aconsejable definir índices de manera indiscriminada. Lo que se debe hacer es definir índices sobre
columnas a partir de las cuales se vayan a hacer consultas frecuentes.

Los índices pueden crearse al crear la tabla, al modificar la estructura de la tabla o creándolos directamente
mediante la sentencia CREATE INDEX.

36
CREATE INDEX
Permite añadir índices a tablas existentes.
 Un índice, al ser creado, puede recibir un nombre. Si no se especifica ese nombre, el índice recibe el
nombre de la primera columna que forma ese índice.
 Un índice se puede definir sobre una columna o sobre un grupo de columnas.
 Para los índices formados por columnas de tipo CHAR o VARCHAR se puede especificar que sólo los
primeros caracteres de esas columnas formen el índice con un número entre paréntesis (longitud).

CREATE [UNIQUE | FULLTEXT] INDEX NombreIndice ON


NombreTabla(NombreColumna[(longitud)] [ASC|DESC],….);

DROP INDEX
Elimina un índice de una tabla DROP INDEX NombreIndice ON NombreTabla;

37
CREATE INDEX
UNIQUE | FULLTEXT
 Si no se especifica UNIQUE o FULLTEXT el índice admite valores duplicados.
 En caso de que sea UNIQUE los valores del índice no podrán repetirse.
 El índice de tipo FULLTEXT sirve para buscar palabras dentro del texto contenido en las
columnas correspondientes.
 Un índice FULLTEXT sólo se admite sobre columnas CHAR, VARCHAR o cualquiera de los
tipos TEXT.
ASC | DESC
 Los índices pueden ordenar los datos de forma ascendente (ASC) o descendente (DESC).

Ejemplo: Crear un índice para los 10 primeros caracteres de la columna Apellidos de la tabla Clientes
CREATE UNIQUE INDEX Un_1 ON Clientes (Apellidos(10));

38

También podría gustarte