3つの列を使用して数値のさまざまな部分を表し、ビューまたは単純なCONCAT式を使用して、請求書ごとに数値全体を取得できます。
次に、新しい番号を取得するには、実際の行IDまたは連結された番号を返す関数を使用してレコードを挿入します。
私はこのようなことをします:(簡潔にするために先行ゼロを省略します)
DROP TABLE IF EXISTS invoces;
CREATE TABLE invoices (
id INT NOT NULL UNIQUE AUTO_INCREMENT
,company CHAR(2)
,number INT
,fiscal_year INT
, PRIMARY KEY (company, number, fiscal_year)
);
DROP PROCEDURE IF EXISTS spCreateInvoice;
DELIMITER $$
CREATE PROCEDURE spCreateInvoice
(
pCompany CHAR(2)
,pFiscalYear INT
)
BEGIN
INSERT INTO invoices (
company, fiscal_year, number
) SELECT
pCompany
, pFiscalYear
, 1+MAX(number)
FROM invoices
WHERE
fiscal_year=pFiscalYear;
SET @id = LAST_INSERT_ID();
SELECT CONCAT(i.company, i.number, i.fiscal_year) invoice_number, i.* from invoices i WHERE id = @id;
END;
$$
DELIMITER ;
CALL spCreateInvoice('MC', 12);
CALL spCreateInvoice('MC', 12);
CALL spCreateInvoice('MC', 12);
CALL spCreateInvoice('MC', 12);
CALL spCreateInvoice('MC', 13);
CALL spCreateInvoice('MC', 13);
CALL spCreateInvoice('MC', 13);
CALL spCreateInvoice('MC', 13);
これをmysqlテストデータベースに対してスクリプトとして実行すると、次の出力が表示されます。
invoice_number id company number fiscal_year
MC012 1 MC 0 12
invoice_number id company number fiscal_year
MC112 2 MC 1 12
invoice_number id company number fiscal_year
MC212 3 MC 2 12
invoice_number id company number fiscal_year
MC312 4 MC 3 12
invoice_number id company number fiscal_year
MC013 5 MC 0 13
invoice_number id company number fiscal_year
MC113 6 MC 1 13
invoice_number id company number fiscal_year
MC213 7 MC 2 13
invoice_number id company number fiscal_year
MC313 8 MC 3 13