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.
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 formatoAAAA-id_empresa-nr_secuencial_por_empresa
. El trigger verifica la columnainvoice_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
ecompany_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 tablainvoice
para que se ajusten a sus requisitos específicos.