Alcance
Lenguajes:.NET, C/SQL, Visual Basic, Visual FoxPro, Java
DBMSes: DB2 UDB for iSeries, DB2 Universal Database, Informix, Oracle, SQL Server
Descripción
En algunos casos puede haber varios conjuntos de atributos que cumplen las condiciones de una llave primaria. En ese caso decimos que cada conjunto es una llave candidata. Dado que la llave primaria es la que representa la tabla en otras tablas, se debe elegir cual de las llaves candidatas será la llave primaria.
El concepto de llave candidata -no primaria-se implementa en GeneXus permitiendo la definición de índices de usuario con la característica 'Unique'. Con esta funcionalidad se incrementa la productividad al evitar que el usuario GeneXus tenga que definir e invocar a procedimientos de control de unicidad.
Manejo de conflictos en tiempo de ejecución
Dada la existencia de índices secundarios 'Unique', se puede tener conflicto de registro duplicado ya no solo en las inserciones de nuevos registros sino también en las actualizaciones, si es que éstas actualizan algun atributo perteneciente a una llave candidata.
En las transacciones, tanto en insert como en update, ante un conflicto de llave candidata duplicada se desplegará el mensaje "Record already exists" (en el lenguaje correspondiente a la Knowledge Base).
En los grupos 'New' / 'For Each', ante un conflicto de llave candidata duplicada se ejecutará el código perteneciente al 'When duplicate' si éste existe y sinó directamente no se ejecutará la inserción/actualización.
Notar que entonces, a partir de esta versión se soporta el comando 'when duplicate' dentro de un grupo 'For Each'.
Manejo de conflictos en reorganizaciones
Dada la existencia de llaves candidatas, existen nuevos casos de falla de reorganizaciones. GeneXus, en un IA detecta los posibles casos de conflicto y le avisa al usuario en el IAR de los mismos. Por otro lado, en tiempo de ejecución, el primer paso de la reorganización realiza los controles necesarios de forma de evitar que las reorganizaciones cancelen en pasos intermedios. En caso de detectar conflictos le da la posibilidad al usuario de detener la reorganización.
Consideraciones generales
Las llaves candidatas compuestas por varios atributos pueden tener algunos de los atributos que la componen con valor nulo. Desde el punto de vista de la unicidad, el valor nulo es igual que cualquier otro valor.
Es decir, solamente puede existir un registro con valor nulo en un atributo que forma parte de una llave candidata. El diagrama de navegación de un For Each que tiene condiciones por igual ( '=' ) en todos los atributos de una llave candidata se muestra como For First.
Ejemplos
Algunos ejemplos de uso de las llaves candidatas son:
1- De las personas se tiene, entre otros datos, un identificador y la cedula de identidad. Para modelar esta realidad se puede definir una transacción con clave primaria Identificador (definido como un autonumerado) y dentro de los atributos secundarios uno para representar la cédula de identidad. Luego se define un índice de usuario sobre este último que tiene la característica de ser 'Unique'.
Si en un sitio web no se desea que existan varios usuarios (UserId) respondiendo a la misma dirección de correo electrónico (UserMail), uno de los dos debería ser la llave primaria y el otro una candidata.