Está en la página 1de 34

Índices y llaves foráneas

Bases de datos I –
Ingeniero juan camilo Vanegas González
ÍNDICES EN MySQL

 Los índices se utilizan para buscar filas con valores de columna


específicos rápidamente. Sin un índice, MySQL debe comenzar con
la primera fila y luego leer toda la tabla para encontrar las filas
relevantes. Cuanto más grande es la tabla, más cuesta esto.
 Si la tabla tiene un índice para las columnas en cuestión, MySQL
puede determinar rápidamente la posición a buscar en el medio del
archivo de datos sin tener que mirar todos los datos. Esto es mucho
más rápido que leer cada fila secuencialmente.
TIPOS DE ÍNDICES
 LLAVE PRIMARIA:
 Una clave primaria es un índice sobre uno o más campos donde cada valor es único
y ninguno de los valores son NULL.
 Sintaxis con PK:
CREATE TABLE nombreTabla (campo1 tipoDato, [campo2...,] PRIMARY KEY
(campo1 [,campo2...]) );
 Edición sin pk:
ALTER TABLE nombreTabla ADD PRIMARY KEY(campo1 [,campo2...]);
 Creación null ni pk:
CREATE TABLE usuarios(id int, nombre varchar(50), apellidos varchar(70));
 Edición not null y pk:
ALTER TABLE usuarios MODIFY id INT NOT NULL, ADD PRIMARY KEY(id);
TIPOS DE ÍNDICES
 Índices ordinarios:
 Un índice que no es primario permite valores duplicados (a menos que los
campos hayan sido especificados como UNIQUE).
 Creación:
CREATE TABLE nombreTabla(campo1 tipoDato, campo2 tipoDato,.. INDEX
[nombreIndice] (campo1 [,campo2...]));
 Si la tabla ya existe:
ALTER TABLE nombreTabla ADD INDEX [nombreIndice] (campo1
[,campo2...]);
 Otra forma con tabla existente:
CREATE INDEX nombreIndice ON nombreTabla(campo1 [,campo2...]);
Ejemplo índice ordinario

 Creación de la tabla:
 CREATE TABLE usuarios(id int, nombre varchar(50), apellidos
varchar(70));
 Se puede crear con alter:
 ALTER TABLE usuarios ADD INDEX idx_apellidos (apellidos);
 O se puede crear con create:
 CREATE INDEX idx_apellidos ON usuarios(apellidos);

SHOW INDEX FROM TABLE;


Tipos de índices
 Índices únicos (unique):
 Los índices únicos son básicamente como los índices ordinarios, excepto
que los valores duplicados no son permitidos.
 Ejemplo:
 CREATE TABLE usuarios(id int, nombre varchar(50), apellidos
varchar(70));
 ALTER TABLE usuarios ADD UNIQUE idx_nombre (nombre);
 CREATE UNIQUE INDEX idx_apellidos ON usuarios(apellidos);
Tipos de índices

 Los índices compuestos son simplemente aquellos que están


basados en múltiples columnas. MySQL únicamente usa un índice
por tabla cuando está procesando una consulta. Esto significa que si
tenemos varias columnas que frecuentemente aparecen juntas en
una cláusula WHERE, tenemos la oportunidad de acelerar estas
consultas al crear un índice compuesto.
Ejemplo índice compuesto

 CREATE TABLE usuarios(id int, nombre varchar(50), apellidos varchar(70));


 ALTER TABLE usuarios ADD INDEX idx_nombre(nombre, apellidos);

 SELECT * FROM usuarios WHERE nombre='Eduardo';


 SELECT * FROM usuarios WHERE nombre='Eduardo' AND apellidos='Zarate
M';
 SELECT * FROM usuarios WHERE apellidos='Zarate M';
Parte 2
Llaves foráneas

 …integridad referencial significa que cuando un registro en una tabla haga


referencia a un registro en otra tabla, el registro correspondiente debe existir.
Por ejemplo, consideremos la relación entre una tabla cliente y una tabla
venta.
 ¿Qué de se debe cumplir?...
 Los campos que se enlazan deben ser del mismo tipo de dato y tamaño.
 Los nombres de las claves foráneas deben ser únicos en la base de datos
 En la tabla que hace referencia, debe haber un índice donde las columnas
de clave extranjera estén listadas en primer lugar, en el mismo orden.
Creando campo en personas (fk)

ALTER TABLE usuarios ADD


Id_curso_fk INT (11) NOT NULL;
CREANDO UNA SEGUNDA TABLA

CREATE TABLE CURSOS (Id_curso INT


(3) AUTO_INCREMENT PRIMARY KEY,
Nombre_curso VARCHAR(30) NOT
NULL);
sintaxis

ALTER TABLE tabla1


ADD CONSTRAINT nombreclaveforanea
FOREIGN KEY (campotabla1)
REFERENCES tablaquereferencia
(campoquereferencia);
Agregando referencia (fk)

ALTER TABLE usuarios ADD


CONSTRAINT fk_usuarios_curso
FOREIGN KEY (Id_curso_fk)
REFERENCES cursos(Id_curso);
Error?

 Cómo la tabla ya tiene datos no es posible crear la llave


foránea… procedemos:
 Truncate table personas -> para borrar todos los
registros
Borrando la fk

ALTER TABLE `personas` DROP


INDEX `fk_personas_curso`;
Creando fk desde la tabla

 Primero borramos la tabla personas y


cursos por completo:
 Drop table personas;
 Drop table cursos;
Creando de nuevo las tablas

create table Cursos (Id_curso INT (11)


AUTO_INCREMENT PRIMARY KEY,
Nombre_curso VARCHAR(30) NOT
NULL);
Creando tabla personas

Create table personas (Id_personas INT(3), Nombre Varchar(
45) NOT NULL, Apellido Varchar(45) NOT NULL, Edad int
(2), Telefono Bigint, Direccion Varchar(45), NumeroDocume
nto Bigint NOT NULL, Tiposangre Varchar(2) NOT NULL, 
PesoKg float(3,2), EstaturaCms float(3,2), Id_curso_fk INT
(11), PRIMARY KEY(id_personas), FOREIGN KEY
(Id_curso_fk) REFERENCES cursos(Id_curso));
Insertando datos

INSERT INTO cursos (Id_curso, Nombre_curso)


VALUES (1, 'Programacion web'), (2, 'Bases de
datos 1'), (3, 'Bases de datos 2'), (4, 'Algortimos'),
(5, 'Servidores’);
Borrando datos de cursos

 Truncate table cursos;


 DELETE FROM cursos WHERE
Id_curso = 1;
Insertando datos de otra forma

INSERT INTO cursos VALUES (1,


'Programacion web'), (2, 'Bases de datos
1'), (3, 'Bases de datos 2'), (4,
'Algortimos'), (5, 'Servidores’);
Insertando datos en personas

INSERT INTO personas (Id_personas, Nombre,


Apellido, Edad, Telefono, Direccion,
NumeroDocumento, Tiposangre, PesoKg,
EstaturaCms, Id_curso_fk) VALUES (1, 'Carlos',
'Silva', 25, 310258741, 'Carrera 51 # 12 - 11',
1112772158, 'A+', 59, 1.74, 10);
Insertando datos en personas

INSERT INTO personas (Id_personas, Nombre,


Apellido, Edad, Telefono, Direccion,
NumeroDocumento, Tiposangre, PesoKg, EstaturaCms,
Id_curso_fk) VALUES (1, 'Carlos', 'Silva', 25,
310258741, 'Carrera 51 # 12 - 11', 1112772158, 'A+', 59,
1.74, 4);
Insertando más de un registro

INSERT INTO personas (Id_personas, Nombre, Apellido,


Edad, Telefono, Direccion, NumeroDocumento,
Tiposangre, PesoKg, EstaturaCms, Id_curso_fk)
VALUES (1, 'Carlos', 'Silva', 25, 310258741, 'Carrera 51
# 12 - 11', 1112772158, 'A+', 59, 1.74, 4), (2, 'Andrea',
'Guzman', 65, 3002569871, 'Calle 22 # 11-56', 31400894,
'B+', 55, 1.56, 1);
Otra forma

INSERT INTO personas VALUES (1, 'Carlos',


'Silva', 25, 310258741, 'Carrera 51 # 12 - 11',
1112772158, 'A+', 59, 1.74, 4), (2, 'Andrea',
'Guzman', 65, 3002569871, 'Calle 22 # 11-56',
31400894, 'B+', 55, 1.56, 1);
Backup

 mysqldump -u root -p
prueba_camilo_vanegas >
db_backup_camilo.sql

 mysqldump -u root -p
ejemplo_backup <
db_backup_camilo.sql
Ejercicio

 Crear una base de datos llamada


colegio_nombre_apelllido
 Crear una tabla que se llame estudiantes con los siguientes
campos:
 Id_estudiante int(11) pk not null auto incremental.
 Nombre_estudiante varchar(45) not null.
 Apellido_estudiante varchar(45) not null.
 Edad_estudiante int(2).
Ejercicio

 Crear una tabla que se llame carreras con los siguientes


campos:
 Id_carrera int(11) pk not null auto incremental.
 Nombre_carrera varchar(45) not null.
ejercicio

 Crear una tabla que se llame generos con los siguientes


campos:
 Id_genero int(11) pk not null auto incremental.
 Nombre_genero varchar(45) not null.
ejercicio

 Crear dos llaves foráneas en la tabla estudiantes, las llaves


foranes debe ser las llaves primarias de las tablas carreras
y géneros (en el mismo orden).
ejercicio

 Deben insertar en la tabla carreras las siguientes carreras:


 Ingeniería de sistemas
 Agropecuaria.
 Administración de empresas.
 Ingeniería ambiental.
ejercicio

 Deben insertar en la tabla genero:


 1, masculino
 2, femenino.
ejercicio

 Insertar los datos del Excel (estudiantes.xls) en la tabla


estudiantes.

 El archivo a enviar se debe llamar


colegio_nombre_apellido.sql

 NOMBRE Y APELLIDO EQUIVALEN A SU NOMBRE Y A


SU APELLIDO.

También podría gustarte