Cargando

Por Alfonso Ricaño En la segunda parte hicimos una tabla con una llave primaria, ahora crearemos otra tabla, y haremos una liga de integridad referencial, mediante una llave foránea (foreign key).

Suponiendo que la tabla personas que fue creada en la parte 2 se refiere a las personas que trabajan en una oficina, ahora vamos a crear una tabla donde especifiquemos el equipo que tiene cada persona a su cargo. Para ello deberemos de guardar los datos de: * Nombre del Equipo * Precio * Fecha de asignación Obviamente, tendremos que enlazar al equipo y a la persona que fue asignado. Para ello tenemos que agregar en la tabla otra columna que haga referencia a la clave de la persona. Si nos vamos directamente al código SQL para la creación de la tabla, queda algo así: CREATE TABLE EQUIPO( CLAVEPERSONA INTEGER NOT NULL, NOMBREEQUIPO VARCHAR(100), PRECIO FLOAT, FECHA_ASIGNACION DATE) Aquí nos damos cuenta de que se utilizan varios tipos de datos (INTEGER, VARCHAR, FLOAT, DATE). A continuación se muestra una tabla con los tipos de datos de InterBase.

Nombre Tamaño Precisión
BLOB Variable Ninguna.
CHAR(n) n caracteres De 1 a 32767 bytes
DATE 64 bits De 1/01/100 a 29/02/32768
DECIMAL(precisión, escala) Variable (16, 32, 64 bits)

Precisión=de 1 a 18. Espefica exactamente los dígitos de precisión que se guardarán.
Escala=de 1 a 18. Especifica el número de lugares decimales a guardar.

SMALLINT 16 bits -32768 a 32767
TIME 64 bits 0:00 AM a 23:59:9999 PM
TIMESTAMP 64 bits Igual que el tipo DATE; pero también incluye información de la hora.
VARCHAR(n) n caracteres 1 a 32,765 bytes
Antes de crear la tabla de EQUIPO en InterBase, vamos a revisar dos cosas: Primero, si tiene llave primaria. Sabemos que una llave primaria debe de identificar únicamente a cada registro de la tabla. Así que ?Cuál campo o combinación de campos es la llave primaria? Podemos escoger la columna CLAVEPERSONA como llave primaria, pero ?Qué tal si la persona tiene dos o más equipos a su cargo? Para empezar, si definimos como llave primaria a la columna CLAVEPERSONA, InterBase no nos dejará agregar más de un equipo a cada persona, ya que un valor en una llave primaria no se puede repetir. Entonces podemos tomar las combinaciones de la columna CLAVEPERSONA y NOMBREEQUIPO. Pero aquí tampoco conviene, ya que no se recomienda que las columnas con descripciones o valores sean utilizadas en una llave primaria. Así que la solución es crear una nueva columna que sirva de llave primaria. Esta nueva columna puede contener un valor consecutivo que se incremente cada vez que se agrega un nuevo registro, de esta manera no habrá valores duplicados. Para crear automáticamente (desde InterBase) estas acciones, debemos de utilizar un Generador y un Trigger, que veremos a continuación, pero antes debemos de crear la tabla, cuya definición en SQL queda así: CREATE TABLE EQUIPO( CLAVEEQUIPO INTEGER NOT NULL, CLAVEPERSONA INTEGER NOT NULL, NOMBREEQUIPO VARCHAR(100), PRECIO FLOAT, FECHA_ASIGNACION DATE, PRIMARY KEY(CLAVEEQUIPO), FOREIGN KEY(CLAVEPERSONA) REFERENCES PERSONAS(CLAVEPERSONA)) Aquí vemos como se agregó el enlace de integridad referencial hacia la tabla PERSONAS, esto se hace con una definición de llave foránea (FOREIGN KEY) e indicándole la columna local y la tabla a la que se va a crear el enlace de integridad, así como la columna sobre la que se va a hacer el enlace de integridad. Una vez que se ejecutó esta definición de tabla en el WISQL, y revisamos en la ventana Browse, veremos las dos tablas: Ahora vamos a crear el generador que nos dará los valores consecutivos y únicos para la columna CLAVEEQUIPO de la tabla EQUIPO. Esto es muy sencillo, sólo hay que especificar el nombre del generador y utilizar la instrucción CREATE GENERATOR: CREATE GENERATOR G_CLAVEEQUIPO Esto lo escribimos en la sección Cursor del WISQL y lo ejecutamos (acuérdate de confirmar la transacción después de ejecutar cada instrucción). Ahora vamos a crear un trigger que tome un valor del generador y lo asigne al campo CLAVEEQUIPO cada vez que se agregue un nuevo registro. Como se explicó anteriormente, se pueden crear triggers para antes y después de insertar/modificar o eliminar un registro. En este caso, vamos a crear un trigger para antes de insertar. Para crear el trigger, seleccionamos la tabla equipo en la ventana browse (como se muestra en la imagen anterior) y seleccionamos la parte Triggers, de esta manera: Oprimimos el botón New, y nos saldrá una plantilla para crear el trigger: Date cuenta que lo que está con // antes muestra las opciones que tenemos, pero debemos de quitar algunas cosas. Por ejemplo, donde dice: // BEFORE AFTER sólo debemos utilizar uno de los dos: o BEFORE, ó AFTER. Igualmente pasa en la parte de INSERT UPDATE DELETE. En el caso del trigger que vamos a crear, utilizaremos BEFORE INSERT, para que se ejecute justo antes de insertar el registro. También cambiaremos el nombre del trigger a EQUIPO_BI, aunque puede llevar cualquier nombre, pero así sabremos que es un trigger que pertenece a la tabla EQUIPO y que se ejecuta antes de insertar (Before Insert). A continuación muestro el código completo del trigger: CREATE TRIGGER EQUIPO_BI FOR EQUIPO BEFORE INSERT AS BEGIN NEW.CLAVEEQUIPO=GEN_ID(G_CLAVEEQUIPO, 1); END Para crearlo, tenemos que oprimir el botón: e inmediamente después el botón que confirma la transacción: Hasta aquí tendremos las dos tablas, con una integridad referencial entre ellas, y la tabla de EQUIPO con un trigger que utiliza un generador para ir creando los valores de la llave primaria. En la próxima entrega hablaré ahora sí de las transacciones, y un poco más de los triggers y procedimientos.