/*Autentificación mediante OpenId*/

miércoles, 14 de enero de 2009

Scripts en MySql y claves ajenas

Finalmente, he avanzado algo que debo anotar para compartir y para no olvidar: he descubierto, tras no pocos avatares dada mi natural tendencia a irme por las ramas, cómo funcionan los scripts en MySql, y debo decir que es bastante chorra. Nos voy a poner un ilustrativo ejemplo (y digo nos porque esto mismo miraré yo la próxima vez que tenga que hacerlo) (y la siguiente) (y la otra...):

$mysql -uroot -p < archivoBD.sql

Pregunta el password, y ¡hala!, el contenido del archivo scriptBD.sql a la saca. Y para separar las sentencias dentro del archivo, un fermoso punto y coma. Así, un mínimo script tiene una pinta parecida a esta:

create database `definicion`;

CREATE TABLE `definicion`.`SEXOS` (
`CoSex` tinyint(4) NOT NULL,
`DesSex` varchar(15) character set latin1 NOT NULL,
PRIMARY KEY (`CoSex`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
insert into definicion.SEXOS values (0, 'Desconocido');
insert into definicion.SEXOS values (1, 'Femenino');
insert into definicion.SEXOS values (2, 'Masculino');


Bueno, pues con esto tenemos creada la base de datos «definicion», dentro de ella la tabla «SEXOS» con el juego de caracteres Unicode (esto está por ver, probaremos acentos, etc.) y aprovechamos para introducir tres sexos de nuestros conejillos de indias. Bien. Pues ahora viene el otro descubrimiento: las claves ajenas.

No las claves ajenas en sí mismas, cachondos, si no cómo codificarlo en MySql. Vamos a crear, por ejemplo, una tabla de las personas que podrán solicitar pruebas y pondremos una clave ajena para relacionar la tabla con la de SEXOS reción creada.

CREATE TABLE `definicion`.`FACULTADOS` (
`CoFac` smallint(6) unsigned NOT NULL,
`IdProfFac` varchar(20) character set latin1 NOT NULL,
`FirmaFac` varchar(50) character set latin1 default NULL,
`CoSexFac` tinyint(4) NOT NULL default 0,
PRIMARY KEY USING BTREE (`CoFac`),
INDEX (`CoSexFac`),
FOREIGN KEY (`CoSexFac`) REFERENCES `SEXOS`(`CoSex`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

Bien, varias cosas. Mis pesquisas me han llevado a descubrir que MySql necesita un índice en cada tabla sobre el campo (los campos, en realidad) que vamos a relacionar. Por un lado, en la tabla SEXOS, ya lo tiene porque es la clave primaria. Por otro lado, los facultados para pedir tendrán un código (interno, numérico, asignado por el sistema, gracias), algún código identificativo, un texto con el que firmar, y, de momento, un sexo.

A este campo, el sexo del facultado, le hacemos un índice y luego le decimos que es clave ajena y que referencia al campo del código del sexo en la tabla SEXOS. Ya está: la definición ya se la traga. El próximo paso, antes de seguir, será ver si efectivamente nos impide meter datos en FACULTADOS con un sexo no existente en la tabla SEXOS. Pero eso no será hoy ;-)