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$$