es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo generar una clave principal personalizada con marca de tiempo en Mariadb.

En MariDB quiero crear una tabla para facturas con un id generado automáticamente que consista en ‘YYYY’ concatenado con ‘select count(‘id’) from where company_id = ‘id’. El id es de tipo varchar. Normalmente uso un id simple como id integer auto_increment primary key. Esta vez quiero personalizar mi id de una manera diferente.

El resultado debería ser algo como esto: 20210001. Estaba pensando en hacer algo como lo siguiente:

sql
table create invoice (
id varchar(10) primary key date('YYYY').(select count('id')+1 where company_id = xxx)
...
)

No sé si eso es lo correcto o si hay un enfoque mejor. ¿Cómo puedo lograr un id de factura generado automáticamente basado en el año y el total de facturas + 1?

La razón de esto es que quiero una tabla de facturas con ids únicos como: 2021-companyid-sequentialnrpercompany que se pueda usar directamente como id de factura. En lugar de usar un entero como clave principal, estaba pensando en una cadena única de caracteres como clave principal que también sea un id que se imprimirá en el documento de la factura. Si lo hago demasiado complejo, me gustaría ver una forma mejor y más simple.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr un identificador de factura generado automáticamente basado en el año y el total de facturas +1, se puede utilizar un TRIGGER en MariaDB. A continuación se muestra un ejemplo de cómo lograr esto:

    CREATE TABLE invoice (
    id VARCHAR(15) PRIMARY KEY,
    company_id INT,
    invoice_date DATE,
    invoice_amount DECIMAL(10, 2)
    );

    DELIMITER $$

    CREATE TRIGGER tr_insert_invoice BEFORE INSERT ON invoice FOR EACH ROW
    BEGIN
    DECLARE prefix VARCHAR(4);
    DECLARE seq_num INT;
    SET prefix = DATE_FORMAT(NEW.invoice_date, ‘%Y’);
    SET seq_num = COALESCE((SELECT MAX(SUBSTRING_INDEX(id, ‘-‘, -1)) FROM invoice WHERE SUBSTRING_INDEX(id, ‘-‘, 1) = CONCAT(prefix, ‘-‘, NEW.company_id)), 0) + 1;
    SET NEW.id = CONCAT(prefix, ‘-‘, NEW.company_id, ‘-‘, seq_num);
    END $$

    DELIMITER ;

    Con este trigger implementado, cada vez que se inserta una nueva fila en la tabla invoice, el trigger generará un id en el formato AAAA-id_empresa-nr_secuencial_por_empresa. El trigger verifica la columna invoice_date para obtener el año y luego encuentra el número de secuencia más alto para la combinación de año e identificación de empresa dada. Incrementa ese número en uno y lo utiliza en el nuevo id de factura.

    Tenga en cuenta que para que esto funcione correctamente, deberá asegurarse de que las columnas invoice_date e company_id estén configuradas correctamente en cada nueva fila. Además, es posible que deba ajustar los tipos de datos y las longitudes de las columnas en la tabla invoice para que se ajusten a sus requisitos específicos.

Comments are closed.