それ自体は悪い習慣ではありませんが、テーブルの構造的整合性を保証するために別の「従来の」数値主キー フィールドを用意し、請求書番号用に別のフィールドを用意する価値があるかもしれません。
次に、単純なMAX+1を使用するか、キー テーブルから検索するなど、さまざまなロジックを使用してその請求書番号を入力し、さまざまなタイプの請求書にさまざまな番号付けシーケンスを許可できます。
例えば:
CREATE TABLE `keys` (
`id` INT NOT NULL auto_increment,
`type` VARCHAR(10) NOT NULL,
`prefix` VARCHAR(10) NOT NULL,
`value` INT(10) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
);
INSERT INTO `keys` (`type`, `prefix`) VALUES
('Sales Receipt', 'SRI'),
('Sales Invoice', 'SIN'),
('Sales Refund', 'SRF');
次に、(疑似)コードで実行できます
Database.BeginTransaction;
NewInvNum = Database.Query("SELECT `value` FROM `keys` WHERE `type` = 'SIN'");
MyInvoice.InvoiceNumber = NewInvNum;
Database.SaveInvoice(MyInvoice);
Database.Query("UPDATE `keys` SET `value` = {0} WHERE `type` = 'SIN'", NewInvNum+1);
Database.CommitTransaction;
複数の請求書が作成中の場合、それらが同じ番号を取得しないように、トランザクション (またはその他の同時実行保護) は重要です。