Rozwiązanie proste, ale wymagał jednej zmiany w konfiguracji my.cnf, dokładniej thread_stack bo wartość 64K to deko mało. Całość bazuje na założeniu, że numer faktury to ROK/NUMER, gdzie numer jest autoinkrementowaną wartością.
Tablica t_faktury, w której numer faktury jest reprezentowany za pomocą pola fvat_no trigger dla niej i procedura poniżej:
DROP TRIGGER IF EXISTS fvat_number;
DROP PROCEDURE IF EXISTS generuj_fvatno;
DELIMITER $$
CREATE PROCEDURE generuj_fvatno(OUT numerek VARCHAR(30))
BEGIN
SELECT
CONCAT(DATE_FORMAT(CURDATE(), '%Y'),'/',COUNT(fvat_no) + 1) INTO numerek
FROM t_faktury
WHERE
SUBSTRING_INDEX(fvat_no, '/', 1) = DATE_FORMAT(CURDATE(), '%Y')
LIMIT 1 ;
END$$
CREATE TRIGGER fvat_number BEFORE INSERT ON t_faktury
FOR EACH ROW BEGIN
CALL generuj_fvatno(@OUT);
IF @OUT = NULL THEN
SET NEW.fvat_no = CONCAT(DATE_FORMAT(CURDATE(), '%Y'),'/', 1);
ELSE
SET NEW.fvat_no = @OUT;
END IF;
END$$
DROP PROCEDURE IF EXISTS generuj_fvatno;
DELIMITER $$
CREATE PROCEDURE generuj_fvatno(OUT numerek VARCHAR(30))
BEGIN
SELECT
CONCAT(DATE_FORMAT(CURDATE(), '%Y'),'/',COUNT(fvat_no) + 1) INTO numerek
FROM t_faktury
WHERE
SUBSTRING_INDEX(fvat_no, '/', 1) = DATE_FORMAT(CURDATE(), '%Y')
LIMIT 1 ;
END$$
CREATE TRIGGER fvat_number BEFORE INSERT ON t_faktury
FOR EACH ROW BEGIN
CALL generuj_fvatno(@OUT);
IF @OUT = NULL THEN
SET NEW.fvat_no = CONCAT(DATE_FORMAT(CURDATE(), '%Y'),'/', 1);
ELSE
SET NEW.fvat_no = @OUT;
END IF;
END$$