Vous êtes sur la page 1sur 10

S.G.B.D.

PRÁCTICAS
98/99.

PRACTICA MYSQL

OBJETIVO DE ESTA PRACTICA

Después de realizar, esta práctica el alumno debe saber:

• Creación de una base de datos en mysql.


• Uso de tablas InnoDB: integridad referencial, actualización y borrado.
• Gestión de transacciones.

BASE DE DATOS “LA UNIVERSIDAD”

A continuación se muestran las tablas creadas en Access para la BD


universidad:

La estructura de las tablas es la siguiente:

PERSONA

Realizado por José Manuel Frías Díaz


S.G.B.D. PRÁCTICAS
98/99.

Campo
Tipo dato
Tamaño
Otros

DNI
Texto-Varchar2
9
Primary Key

Nombre
Texto
25
Requerido - Not
Null

Apellido
Texto
50
Requerido - Not
Null

Ciudad
Texto
25

DireccionCalle
Texto
50

DireccionNum
Texto
3

Telefono
Texto
9

FechaNacimiento
Fecha/Hora
Fecha corta
Fecha corta

Varon
Texto
1
Check (Varon In
('0','1'))

Realizado por José Manuel Frías Díaz


S.G.B.D. PRÁCTICAS
98/99.

ASIGNATURA
Campo
Tipo dato
Tamaño
Otros

IdAsignatura
Texto
6
Primary Key

Nombre
Texto
50
Not Null

Creditos
Numérico
Simple
Check
(Creditos In
(4.5,6,7.8,9))

Cuatrimestre
Texto
1
Check
(Cuatrimestre
In ('1','2'))

CosteBasico
Numérico
Simple
Number(3,2)

IdProfesor
Texto
4
References
PROFESOR(IdP
rofesor)

IdTitulacion
Texto
6
References
TITULACION(I
dTitulacion)

Curso
Fecha/Hora
Fecha corta
Check (Curso
In
('1','2','3','4'))

Realizado por José Manuel Frías Díaz


S.G.B.D. PRÁCTICAS
98/99.

ALUMNO
Campo
Tipo dato
Tamaño
Otros

IdAlumno
Texto
7
Primary
Key

DNI
Texto
9
References
PERSONA(
DNI)

PROFESOR
Campo
Tipo dato
Tamaño
Otros

IdProfesor
Texto
4
Primary Key

DNI
Texto
9
References
PERSONA(D
NI)

TITULACION

Realizado por José Manuel Frías Díaz


S.G.B.D. PRÁCTICAS
98/99.

Campo
Tipo dato
Tamaño
Otros

IdTitulacion
Texto
6
Primary Key

Nombre
Texto
20
Not Null -
Unique

ALUMNO_ASIGNATURA
Campo
Tipo dato
Tamaño
Otros

IdAlumno
Texto
7
References
ALUMNO(IdAlumno
)

IdAsignatura
Texto
6
References
ASIGNATURA(IdAsi
gnatura)

NumeroMatricula
Numérico
Entero
Not Null -
Check(NumeroMatr
icula>=1 AND
NumeroMatricula<
=6)

PRÁCTICA

1) Crear la BD anterior desde la consola mysql utilizando el motor de BD InnoDB.


2) Cargar las tablas con los datos proporcionados en el archivo universidad.mdb
3) Demostrar con un ejemplo que las tablas InnoDB implementan la integridad
referencial, la actualización en cascadaza y el borrado en cascada.

Realizado por José Manuel Frías Díaz


S.G.B.D. PRÁCTICAS
98/99.

4) Demostrar con un ejemplo que las tablas InnoDB implementan control de


transacciones.

Realizado por José Manuel Frías Díaz


S.G.B.D. PRÁCTICAS
98/99.

1) No podemos olvidar habilitar el motor InnoDB. Si estamos con xampp


debemos editar el archivo:
mysql/bin/my.cfn

Dejamos las siguientes lineas como siguen:

#skip-innodb
# Uncomment the following if you are using InnoDB tables
innodb_data_home_dir = D:/DEVserver/mysql/data/
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = D:/DEVserver/mysql/data/
innodb_log_arch_dir = D:/DEVserver/mysql/data/
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
set-variable = innodb_buffer_pool_size=16M
set-variable = innodb_additional_mem_pool_size=2M
#Set .._log_file_size to 25 % of buffer pool size
set-variable = innodb_log_file_size=5M
set-variable = innodb_log_buffer_size=8M
innodb_flush_log_at_trx_commit=1
set-variable = innodb_lock_wait_timeout=50

Las tablas deben ser creadas en un determinado orden, ya que la


integridad referencial lo requiere.

CREATE TABLE `persona` (


`dni` VARCHAR( 9 ) NOT NULL ,
`nombre` VARCHAR( 25 ) NOT NULL ,
`apellido` VARCHAR( 50 ) NOT NULL ,
`ciudad` VARCHAR( 25 ) NULL ,
`direccioncalle` VARCHAR( 50 ) NULL ,
`direccionnum` VARCHAR( 3 ) NULL ,
`telefono` VARCHAR( 9 ) NULL ,
`fechanacimiento` DATETIME NULL ,
`varon` ENUM( '0', '1' ) NULL ,
PRIMARY KEY ( `dni` )
) ENGINE = innodb;

CREATE TABLE `alumno` (


`idAlumno` VARCHAR( 4 ) PRIMARY KEY,
`dni` VARCHAR( 9 ),
INDEX(`dni`),
FOREIGN KEY (`dni`) REFERENCES persona (`dni`)
ON UPDATE cascade
ON DELETE cascade
) ENGINE = innodb;

CREATE TABLE `profesor` (


`idProfesor` VARCHAR( 4 ) PRIMARY KEY,
`dni` VARCHAR( 9 ),
INDEX(`dni`),
FOREIGN KEY (`dni`) REFERENCES persona (`dni`)
ON UPDATE cascade
ON DELETE cascade
) ENGINE = innodb;

Realizado por José Manuel Frías Díaz


S.G.B.D. PRÁCTICAS
98/99.

CREATE TABLE `titulacion` (


`idTitulacion` VARCHAR( 6 ) PRIMARY KEY,
`nombre` VARCHAR( 20 ) NOT NULL UNIQUE
) ENGINE = innodb;

CREATE TABLE `asignatura` (


`idAsignatura` VARCHAR( 6 ) PRIMARY KEY,
`nombre` VARCHAR( 50 ) NOT NULL,
`creditos` ENUM( '4', '5', '6', '7', '8', '9' ),
`cuatrimestre` ENUM( '1', '2' ),
`costebasico` DECIMAL(3,2),
`idProfesor` VARCHAR(4),
`idTitulacion` VARCHAR(4),
`curso` DATETIME,

INDEX(`idProfesor`),
FOREIGN KEY (`idProfesor`) REFERENCES profesor (`idProfesor`),

INDEX(`idTitulacion`),
FOREIGN KEY (`idTitulacion`) REFERENCES titulacion (`idTitulacion`)

) ENGINE = innodb;

CREATE TABLE `alumno_asignatura` (


`idAlumno` VARCHAR( 7 ),
`idAsignatura` VARCHAR( 6 ),
`numeroMatricula` ENUM( '1', '2', '3', '4', '5', '6' ) NOT NULL,

INDEX(`idAlumno`),
FOREIGN KEY (`idAlumno`) REFERENCES alumno (`idAlumno`),

INDEX(`idAsignatura`),
FOREIGN KEY (`idAsignatura`) REFERENCES asignatura (`idAsignatura`)

) ENGINE = innodb;

2)
• Exportamos las tables de access a archivos de texto (tabla a
tabla, tenemos que elegir bien los delimitadores de campos)
• Cargamos las tablas mysql con la instrucción LOAD DATA INFILE de
forma que se respete la integridad referencial.

Cargarlas de la forma:

LOAD DATA INFILE 'F:\persona.txt'


INTO TABLE persona
FIELDS TERMINATED BY '\t'
LINES STARTING BY '' TERMINATED BY '\n';

Realizado por José Manuel Frías Díaz


S.G.B.D. PRÁCTICAS
98/99.

3)

INSERT INTO `persona` ( `dni` , `nombre` , `apellido` , `ciudad` ,


`direccioncalle` , `direccionnum` , `telefono` , `fechanacimiento` ,
`varon` )
VALUES ('52584871T', 'pedro', 'picapiedra', 'del cabo', 'del rio',
'3', '952556699', '14-10-1971', '1');

Integridad referencial:

•Intentamos insertar un registro en la tabla alumno que no está


en la tabla persona y da error de integridad referencial:
INSERT INTO `alumno` ( `idAlumno` , `dni` )
VALUES ('12', '53535353Y' );
Actualización en cascada:
• Cambiamos un DNI en la tabla PERSONA que sea alumno y
comprobamos que el DNI ha cambiado en la tabla alumno
UPDATE `persona` SET `dni` = '52584871R',
`ciudad` = 'del cabo',
`direccioncalle` = 'del rio',
`direccionnum` = '3',
`telefono` = '952556699',
`fechanacimiento` = '0000-00-00 00:00:00',
`varon` = '1' WHERE `dni` = '52584871T';
Borrado en cascada:
• Borramos un registro persona y se borra el registro en la tabla
alumnos
DELETE FROM persona WHERE dni='52584871T';

4) Tema 15: El motor de almacenamiento Innodb

Por defecto, MySQL se ejecuta con el modo autocommit activado. Esto


significa que en cuanto ejecute un comando que actualice (modifique)
una tabla, MySQL almacena la actualización en disco.

Ejemplo 1: deshacemos una operación de inserción.


SET AUTOCOMMIT=0;
START TRANSACTION;

INSERT INTO `persona` ( `dni` , `nombre` , `apellido` , `ciudad`


, `direccioncalle` , `direccionnum` , `telefono` ,
`fechanacimiento` , `varon` )
VALUES ('52584111T', 'pablo', 'picapiedra', 'del cabo', 'del
rio', '3', '952556699', '14-10-1971', '1');

ROLLBACK;
Ejemplo 2: insertar un nuevo alumno implica, insertar un registro
persona y un registro alumno
SET AUTOCOMMIT=0;
START TRANSACTION;

INSERT INTO `persona` ( `dni` , `nombre` , `apellido` , `ciudad`


, `direccioncalle` , `direccionnum` , `telefono` ,
`fechanacimiento` , `varon` )
VALUES ('52584111T', 'pablo', 'picapiedra', 'del cabo', 'del
rio', '3', '952556699', '14-10-1971', '1');

Realizado por José Manuel Frías Díaz


S.G.B.D. PRÁCTICAS
98/99.

INSERT INTO `alumno` ( `idAlumno` , `dni` )


VALUES ('20', ''52584111T' );

COMMIT;

Por ejemplo si quisieramos transferir de una cuenta a otro 100 pesos


primero deberíamos de ejecutar:

UPDATE tablename SET value=value-100 WHERE accountno=111

y después

UPDATE tablename SET value=value+100 WHERE accountno=222

Para que se ejecutaran como una unidad tendriamos que colocarlos entre
el BEGIN y el COMMIT

BEGIN
UPDATE tablename SET value=value-100 WHERE accountno=111
UPDATE tablename SET value=value+100 WHERE accountno=222
COMMIT

Realizado por José Manuel Frías Díaz

Vous aimerez peut-être aussi