MySQLMotores BD
InnoDB es un mecanismo de almacenamiento transaccional -con caracteristicas ACID- para MySQL.
Esto aumenta la seguridad de los datos. Realiza bloqueo a nivel de filas y lecturas no bloqueantes
MVCC tipo Oracle que aumentan la concurrencia y las prestaciones.
InnoDB pertenece a Oracle Corporation, se distribuye bajo licencia GPL, pero también se licencia a
empresas que la quieran incluir en su software.
Sigue el modelo ACID con COMMIT, ROLLBACK y recuperacién de caidas.
Bloquea a nivel de fila (tupla), y proporciona concurrencia multiusuario para lectura.
Organiza los datos en disco para optimizar el uso de claves primarias.
Mantiene la integridad de datos mediante restricciones FOREIGN KEY, que se aplican en INSERT,
UPDATE y DELETE.
MyISAM: Implementacién de MySQL del original ISAM. implementa el almacenamiento de datos
de manera sencilla y robusta, y proporciona una alta velocidad de acceso y un tamajio pequefio de
ficheros. El mecanismo MylSAM almacena cada tabla en tres ficheros:
frm con el formato de la tabla
-MYD con los datos
-MYI con los indices
Rapido pero con bajo control de integridad.Para crear la Base de datos podemos ejecutar:
create database Restaurante;
*No hay go.
*El ; es obligatorio
Para elegirla como Base de datos actual: *Los comentarios con
deben llevar espacio detras
use Restaurante;
Podemos eliminar las tablas cuando existen mediante:
drop table if exists DetalleComida;
drop table if exists Comida;
drop table if exists Mesa;
drop table if exists Plato;
drop table if exists TipoPlato;Para crear las tablas
create table Mesa
(CodMesa char(3) primary key);
create table Plato
(CodPlato integer primary key,
Plato varchar(150) not null,
Precio numeric (6,2) not null check(Precio >0),
CodTipoPlato integer not null);
create table TipoPlato
(CodTipoPlato integer primary key,
TipoPlato varchar(100) not null,
Agrupa varchar(10) not null check(Agrupa in
(‘Plato’,'Bebida’)));create table Comida
(IdComida integer auto_increment primary key,
-- cambiado identity a autoincrement
Fecha datetime not null,
CodMesa char(3) not null,
Pagado char(1) not null check(Pagado in ('S','N')) )
engine=innodb
default charset=utf8; . ses
Permite especificar el
quitado default('N') motor y el conjunto de
caracteres
create table DetalleComida
{IdDetalle integer auto_increment primary key,
-- cambiado identity a autoincrement
IdComida integer not null,
CodPlato integer not null,
PrecioPlato numeric (6,2) not null check(PrecioPlato >0),
Servido char(1) not null check(Servido in ('S','N’)));
quitado default ('N')
Lo permite en innodbAdmite la sintaxis check pero no lo valida. También admite darle valor a
la columna auto_increment
insert into Comida values (8,'2012-02-19','A03',"X');
Para que genere el nimero hay que poner la lista de columnas
insert into Comida (Fecha , CodMesa, Pagado) values ('2012-02-19','A03",'N');Foreign key admite la sintaxis, pero no lo valida en el
motor myisam. Si enm el Innodb.
alter table Plato
add constraint Fk_Plato_TipoPlato
foreign key (CodTipoPlato)
references TipoPlato(CodTipoPlato);
alter table Comida
add constraint Fk_Comida_Mesa
foreign key (CodMesa)
references Mesa(CodMesa);
alter table DetalleComida
add constraint Fk_Detallecomida_Comida
foreign key (IdComida)
references Comida(IdComida);
alter table DetalleComida
add constraint Fk_DetalleComida_Plato
foreign key (CodPlato)
references Plato(CodPlato);Insertar Datos
insert into Mesa values ('A01');
insert into Mesa values ('A02’);
insert into Mesa values ('A03');
insert into Mesa values ('A04');El formato de un valor DATE es 'YYYY-MM-DD‘
De acuerdo al estandar SQL ningun otro formato se permite.
Deberia usar este formato en las sentencias UPDATE y en la
clausula WHERE de las sentencias SELECT.
Ademis no necesita DECLARE para la variable que recibe el
valor de la clave generada para Comida.
insert into Comida (Fecha , CodMesa, Pagado) values ('2012-02-18','A01),'S');
set @identity =LAST_INSERT_ID();
insert into DetalleComida ( IdComida,CodPlato,PrecioPlato,Servido) values
(@identity,0,1,'S');
insert into DetalleComida ( |dComida,CodPlato,PrecioPlato,Servido) values
(@identity,0,1,'S');
insert into DetalleComida ( IdComida,CodPlato,PrecioPlato,Servido) values
(@identity,0,1,'S');
insert into DetalleComida ( |dComida,CodPlato,PrecioPlato,Servido) values
(@identity,2,9,'S');
insert into DetalleComida ( IdComida,CodPlato,PrecioPlato,Servido) values
(@identity,5,12,'S');
insert into DetalleComida ( IdComida,CodPlato,PrecioPlato,Servido) values
(@identity,9,6,'S');Se mantiene idéntica la consulta con INNER JOIN
select
c.idcomida,c.fecha,c.codmesa,c.pagado,
d.IdDetalle,d.IdComida,d.CodPlato,d.PrecioPlato,d.Se
rvido,
m.CodMesa,
p.CodPlato,p.CodTipoPlato,p.Plato,p.Precio,
t.CodTipoPlato,t.TipoPlato,t.Agrupa
from comida as c
inner join DetalleComida as d
on c.ldComida=d.IdComida
inner join Mesa as m
on m.CodMesa=c.CodMesa
inner join Plato as p
on p.CodPlato=d.CodPlato
inner join TipoPlato as t
on t.CodTipoPlato=p.CodTipoPlatoEl formato de un valor DATE es 'YYYY-MM-DD‘
De acuerdo al estandar SQL ningtin otro formato se permite.
Deberia usar este formato en las sentencias UPDATE y en la
clausula WHERE de las sentencias SELECT.
select p.Plato
from comida as c
inner join DetalleComida as d
on c.ldComida=d.IdComida
inner join Plato as p
on p.CodPlato=d.CodPlato
where c.Fecha='2012-02-19'
group by p.plato