Claves primarias, claves foráneas, índices

Claves primarias, claves foráneas, índices

En la teoría de bases de datos, se llama clave primaria a un campo, o a una combinación de campos, que identifica en forma única a cada registro, y una clave foránea es una referencia, en una tabla, a la clave primaria de otra tabla. Por ejemplo, en una factura necesitamos identificar para qué cliente se ha hecho la factura.

Por ejemplo, para una tabla de clientes se podría usar, como clave primaria, una de las siguientes opciones:

Sin embargo, lo más recomendable es utilizar un número que nunca verá el usuario final. Para este fin, se necesita un número secuencial. Esto nos trae numerosas ventajas, entre otras:

También hay algunas desventajas; sobre todo, la programación se hace más complicada en algunos casos. Pero he visto en la práctica que es un sacrificio que vale la pena.

Ahora, explicaré los detalles de cómo implementar estas claves "internas". Desafortunadamente, en Visual FoxPro no se puede simplemente marcar un campo como "auto-incrementado" (como se lo haría en Access), pero no es muy complicado lograr lo mismo en Visual FoxPro.

**********************************************************************
FUNCTION SERIALNUMBER(tnSequence)
* Conseguir número secuencial. Usado para generar claves primarias.
local lnSelect
lnSelect = select()
if used("serialnumber")
   select serialnumber
else
   select 0
use serialnumber
endif
set order to "sequence"
seek padr(tnSequence, len(sequence))
if not found()
   append blank
   replace sequence with tnSequence, nextnum with 1
endif
local lnReturnValue
if lock()
   lnReturnValue = nextnum
   replace nextnum with nextnum + 1
else
   lnReturnValue = -1
endif
unlock
select (lnSelect)
return lnReturnValue

Para definir una clave primaria en una tabla, se tiene que crear un índice con una expresión que tiene que ser única. Luego, se define el índice como clave primaria ("Primary"). Esto se lo hace directamente en la definición de la tabla (modify structure). Por ejemplo, en la tabla cliente, se crea un índice por el campo cliente. La forma más rápida de hacer ésto es indicar, en la misma lista de campos, que se quiere tener un índice sobre ese campo (siempre debe ser "ascending"). Luego, en la página de índices se lo marca como "Primary".

Se puede asegurar que otras combinaciones de campos sean únicas. Sólo puede haber una clave primaria en una tabla, pero se pueden marcar otros índices como "Candidate". En otros sistemas de base de datos, esto se llamaría "Unique"; desafortunadamente, en FoxPro esta palabra ya ha sido reservado para algo distinto. Recomiendo no utilizar nunca índices del tipo "Unique" en Visual FoxPro; lo que estos índices logran, mejor se puede lograr con otros métodos. Digamos que Visual FoxPro incluye índices de tipo "Unique" por mantener la compatibilidad con FoxPro.

Si se quiere garantizar unicidad, puede haber un problema con registros borrados: el usuario borra un cliente, digamos que tiene el código (campo cod_cliente) "X1", luego agrega otro registro e intenta poner el mismo código. Visual FoxPro dirá que el registro ya existe. Se puede solucionar esto eliminando permanente el registro borrado (con la orden PACK), pero esto no es muy práctico. Es mejor crear el índice filtrado, con la condición: NOT DELETED().

 

Volver a: Visual FoxPro | Página Principal de Hilmar Zonneveld

1