将发票存储在一个表中的最佳方法是什么。主键是自动生成的,但发票号从每年的1号开始。
这样可以吗?
invoces ------------------------------------------------ `id` int UNSIGNED NOT NULL AUTO_INCREMENT , `invoice_number` int NOT NULL , `year` year NOT NULL , etc... PRIMARY KEY (`id`)
发票编号栏从年初1开始。
谢谢:)
编辑: 问题:如何确定一年何时结束/开始?
想法:多年来创建另一个表。当时间接近年份(设置列例如2010年设置打开= 0)并为新年添加一行(例如2011年设置字段打开= 1)。
新架构:
invoces ------------------------------------------------ `id` int UNSIGNED NOT NULL AUTO_INCREMENT , `invoice_number` int NOT NULL , `fk_year_id` year NOT NULL , etc... PRIMARY KEY (`id`)
invoces_year ------------------------------------------------ `id` int UNSIGNED NOT NULL AUTO_INCREMENT , `year` year NOT NULL , `opened` tinyint NOT NULL PRIMARY KEY (`id`)
答案 0 :(得分:1)
烨。没关系。我这样做。使用UNIQUE键(year,invoice_number)将有助于避免意外错误。
您应该考虑的另一件事是:如果发票被“取消”或“删除”,您是否希望允许“回收”使用或未使用的号码。如果是,那么设置可能会变得更复杂。
答案 1 :(得分:0)
您可以将主键设为invoice_number和year的复合字段。
这样就无需自动增量ID。
答案 2 :(得分:0)
另一个想法是使用复合键和自动递增发票编号。
create table invoices(
year int not null
,invoice_number int not null auto_increment
,primary key(year, invoice_number)
);
insert into invoices(year) values(2009);
insert into invoices(year) values(2009);
insert into invoices(year) values(2009);
insert into invoices(year) values(2010);
insert into invoices(year) values(2010);
insert into invoices(year) values(2010);
select *
from invoices;
+------+----------------+
| year | invoice_number |
+------+----------------+
| 2009 | 1 |
| 2009 | 2 |
| 2009 | 3 |
| 2010 | 1 |
| 2010 | 2 |
| 2010 | 3 |
+------+----------------+
缺点(我个人认为这很大)是没有简单的方法将该行为移植到其他数据库。
<强>更新强> 正如评论中所指出的,“重置行为”仅适用于MyISAM 表。这是一个更大的缺点,因为你将无法使用InnoDB(你应该使用这种数据)。
答案 3 :(得分:0)
执行此操作的另一种方法是按如下方式创建表:
CREATE TABLE invoices( invoiceyear int, invoiceid int AUTO_INCREMENT , amount decimal, PRIMARY KEY ( invoiceyear, invoiceid ) )
这样做的结果是每年都会自动重置新的invoiceid。结果将是这样的:
invoiceyear invoiceid amount 2011 1 1 2011 2 1 2011 3 1 2010 1 1 2010 2 1 2011 4 1
但是,应该注意的是,如果您删除发票并且发票具有该年份的最新编号,则将重复使用该编号。但是,如果您删除上面的发票3,则不会重复使用。