sábado, 16 de agosto de 2008

Comprendiendo la Integridad Referencial

En este pequeño tutorial tratare de explicar brevemente como funciona una integridad referencial (iremos de lo básico a lo más avanzado pero de apoco jeje)...

Hace muy poco gracias a mis nuevos colegas descubrí un motor de base de datos relacionales llamado Firebird (es Open Source) y deriva de Interbase de Borland ... (avísenme si estoy equivocado) Veremos los ejemplos en Mysql y Firebird para ver las diferencias que se nos presentan.

Este ejemplo (pertenece a mi profesor de taller de bases de datos y el código e complementación a mí). la idea es crear lo siguiente:

*- 1 Base de Datos llamada informatica con 2 tablas fabricantes y articulos donde relacionaremos los articulos a un proveedor.

Primero en Firebrid (esto usando la versión 2.1)

Supongamos que ya hemos creado la base de datos informatica



CREATE TABLE FABRICANTES (

CODIGO INTEGER NOT NULL,
NOMBRE VARCHAR(100) CHARACTER SET NONE COLLATE NONE);
ALTER TABLE FABRICANTES ADD CONSTRAINT PKFABRICANTES PRIMARY KEY (CODIGO);
# Aquí Indico la llave Primaria

______________________________________________________________________________________
CREATE TABLE ARTICULOS (
CODIGOART INTEGER NOT NULL,
NOMBRE VARCHAR(100) CHARACTER SET NONE NOT NULL COLLATE NONE,
PRECIO INTEGER,
CODFRABICANTE INTEGER NOT NULL);

ALTER TABLE ARTICULOS ADD CONSTRAINT PKARTICULOS PRIMARY KEY (CODIGOART,CODFRABICANTE);

# Llave Primaria
ALTER TABLE ARTICULOS ADD CONSTRAINT FK_ARTICULOS FOREIGN KEY (CODFRABICANTE) REFERENCES FABRICANTES(CODIGO) ON DELETE CASCADE ON UPDATE CASCADE;
# Genero la relación de Fabricantes a Artículos

Nota 1: Siempre que relacionemos tablas debemos fijarnos que la tabla a la que haremos referencia exista.
Nota 2: En firebird todo es con mayúsculas.
Nota 3: ON DELETE CASCADE ON UPDATE CASCADE; quiere decir que cuando eliminemos un fabricante también eliminaremos los productos asociados a él en la tabla articulos. (los mismo al actualizar datos)... asi que cuidado con esto.
Nota 4: La cláusula CONSTRAINT , Se utiliza en las instrucciones ALTER TABLE y CREATE TABLE para crear o eliminar índices.
Nota 5: CHARACTER SET NONE COLLATE NONE Sirve para seleccionar la codificacion de caracteres en el ejemplo no seleccione ningún tipo.


Clic para agrandar Imagen


En la imagen se ve una pequeña leyenda donde Parent es la tabla padre y Child la tabla hija.


Ahora para que observemos que el código SQL es muy similar lo haremos en Mysql Server
(Forma de hacerlo Mysql)


CREATE TABLE `fabricantes` (
`CODIGO` int(11) NOT NULL,
`NOMBRE` varchar(100) default NULL,
PRIMARY KEY (`CODIGO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `articulos` (
`CODIGOART` int(11) NOT NULL,
`NOMBRE` varchar(100) default NULL,
`PRECIO` int(11) default NULL,
`CODFRABICANTE` int(11) NOT NULL,
PRIMARY KEY (`CODIGOART`,`CODFRABICANTE`),
KEY `CODFRABICANTE` (`CODFRABICANTE`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `articulos`
ADD CONSTRAINT `articulos_ibfk_1` FOREIGN KEY (`CODFRABICANTE`) REFERENCES `fabricantes` (`CODIGO`) ON DELETE CASCADE ON UPDATE CASCADE;


(Forma estandar de codificar las tablas Mysql tambien reconocera este código como estandar SQL)

CREATE TABLE FABRICANTES(
CODIGO INTEGER NOT NULL ,
NOMBRE VARCHAR( 100 )
);
ALTER TABLE FABRICANTES ADD CONSTRAINT PKFABRICANTES PRIMARY KEY ( CODIGO ) ;


ALTER TABLE fabricantes ENGINE = InnoDB;


CREATE TABLE ARTICULOS(
CODIGOART INTEGER NOT NULL ,
NOMBRE VARCHAR( 100 ) ,
PRECIO INTEGER,
CODFRABICANTE INTEGER NOT NULL
);
ALTER TABLE ARTICULOS ADD CONSTRAINT PKARTICULOS PRIMARY KEY ( CODIGOART, CODFRABICANTE ) ;

ALTER TABLE articulos ENGINE = InnoDB

ALTER TABLE `articulos` ADD FOREIGN KEY ( `CODFRABICANTE` ) REFERENCES `informatica`.`articulos` (
`CODFRABICANTE`
) ON DELETE CASCADE ON UPDATE CASCADE ;


Nota 1: Para trabajar con relaciones en Mysql siempre debemos utilizar InnoDB para dar soporte a la integridad referencial.

Nota 2: Si nos fijamos vale lo mismo escribrir int o integer (recomiendo utilizar integer ya que otras bases de datos no soportan int abreviado y nos podemos mal acostumbrar)

Nota 3: A diferencia de Firebird (CHARACTER SET NONE NOT NULL COLLATE NONE) en mysql utilizamos DEFAULT CHARSET=latin1; (en ambos casos el motor asumio esa codificacion por defecto ya que yo no seleccione ningun tipo por lo que asumiremos que son sus valores por defecto.


Clic para ampliar

En el siguiente tutorial realizare los 4 operaciones básicas de Insert, Delete, Update y Select....

ir a la segunda Parte

1 comentario:

Mana dijo...

Saludos... en primer lugar,yo soy un estudiante de primer año de informatica y te queria agradecer enormemente por el trabajo y dedicacion que le has puesto a esto blog... te juro que me ha sido de gran ayuda para entender, las materias que se ma han complicado especialmente en B.D...sinceramente deseo te deso lo mejor y ojala que sigas con este gran trabajo...sin nada más que decir me despido.