Estructuras de Datos

Claves Primarias (PK)

Dificultad: 4/10

Las claves primarias se utilizan para identificar registros en la tabla, por eso no puede haber repetidas; para acelerar la clasificación y filtrado.

Puede haber hasta 40 claves por tabla, pero siempre debe existir al menos una clave primaria.

Estructura de una Clave

Plantilla para una clave (donde pone PK, se escribe la clave primaria. Todo lo que vaya después, son secundarias). Puede haber varias claves primarias, pero, al menos, debe haber una.

AL
keys
{
    key(PK; "<Campo1>", "<Campo2>") { }   // Clave primaria (puede ser compuesta)
    key(SK1; "<Campo>")             { }   // Clave secundaria
}

Poner Clustered = true entre los corchetes de la PK es insignificante porque es el valor por defecto.

Propiedades de las claves

Propiedades de las key (dentro de las llaves de key):

Propiedad Significado
MaintainSiftIndex Mantiene índices de suma (SUMINDEXFIELDS), actualizando saldos e índices en cada inserción
MaintainSqlIndex Si es true, crea el índice en SQL. Si es false, solo existe virtualmente en BC para ahorrar recursos en escritura
Unique La clave secundaria no puede tener valores repetidos
Clustered Define el orden físico de almacenamiento en SQL (por defecto en la PK)

AutoIncrement: numeración automática

AutoIncrement es una propiedad del campo, no de la clave. Cuando se activa en un campo Integer, Business Central asigna automáticamente el siguiente número disponible al crear cada registro.

AL
field(1; "Entry No."; Integer)
{
    AutoIncrement = true;
}

⚠️ Aviso

AutoIncrement no garantiza una secuencia contigua. Si se borra un registro, su número no se reutiliza.

Claves compuestas

Una PK puede estar formada por varios campos combinados. La unicidad se evalúa sobre la combinación completa, no sobre cada campo por separado.

AL
keys
{
    key(PK; "No. Documento", "No. Linea") { }
}

Esto permite que exista el documento DOC001 con las líneas 1, 2 y 3, sin conflicto entre ellas.

Ejemplo completo

AL
table 50102 "Linea Prestamo"
{
    fields
    {
        field(1; "Entry No.";    Integer)
        {
            AutoIncrement = true;  // BC asigna el número automáticamente
        }
        field(2; "No. Prestamo";  Code[20]) { }
        field(3; "No. Linea";     Integer)  { }
        field(4; "No. Libro";     Code[20]) { }
        field(5; "Fecha";         Date)     { }
    }
    keys
    {
        key(PK; "Entry No.")                  { }  // PK simple con AutoIncrement
        key(SK1; "No. Prestamo", "No. Linea") { }  // SK compuesta para búsquedas
        key(SK2; "No. Libro")
        {
            MaintainSiftIndex = true;              // mantiene índices de suma
        }
    }
}

💡 Tips

  • La PK debe ser inmutable: elige campos que nunca vayan a cambiar (cambiar la PK dispara el trigger OnRename).
  • En tablas de movimientos o líneas, lo más habitual es usar un Entry No. con AutoIncrement.
  • Las claves secundarias con MaintainSqlIndex = false ahorran recursos en escritura cuando solo se usan en BC, no en consultas SQL externas.
← Volver a Teoría