Mysql(数据库设计) - 存储从每年1开始的发票

时间:2011-01-05 13:17:44

标签: mysql database

将发票存储在一个表中的最佳方法是什么。主键是自动生成的,但发票号从每年的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`)

4 个答案:

答案 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,则不会重复使用。