这本身并不是一个坏习惯,但可能值得使用不同的“传统”数字主键字段来保证表的结构完整性,并为发票编号设置另一个字段。
然后,您可以使用不同的逻辑填充该发票编号,或者只是一个简单的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;
事务(或其他一些并发保护)很重要,因此当创建多个发票时,它们不会得到相同的编号。