我公司有不同类型的发票。 例如:
H00001 / 2013 。 。 。 H99999 / 2013
和
T00001 / 2013 。 。 。 T99999 / 2013
问题是,新年的编号越来越多。 如何为每个新年重置自动增量值?
这是我目前的代码:
CREATE TABLE `invoices` (
`invoicenumber` mediumint unsigned NOT NULL auto_increment,
`invoicetype` enum('A','B') NOT NULL,
`date` date NOT NULL,
`client` varchar(100) NOT NULL,
PRIMARY KEY (invoicetype,invoicenumber)
) COMMENT='' ENGINE='MyISAM';
答案 0 :(得分:2)
您可以使用ALTER TABLE语句重置自动增量值。用于重置自动增量值的ALTER TABLE语句的语法如下:
ALTER TABLE table_name AUTO_INCREMENT = VALUE;
<强>编辑:强>
如果您不想每年运行此查询,那么您还有其他两个选项可以执行此操作,因为我知道这两个。
答案 1 :(得分:2)
嘿,如果你使用任何客户端应用程序的数据库,如MysqlWorkBench或MYSQL查询浏览器 然后你可以在下面的步骤中设置AutoIncrement no -
答案 2 :(得分:0)
也许你已经找到了一个解决方案,我给出的答案可能没用,因为它已经有七个月了。回到主题,我注意到你有一个有两列的组合主键(invoicetype,invoicenumber)。 因此,不能重复对象 invoicetype,invoicenumber 。 如果您每年重置auto_increment,可能会有重复的对,例如'A',1对于两行,一个发票从2013年开始,另一个从2014年开始。因此您可以消除该主要对防止违反主键约束的关键。您可以使用auto_incremented列定义主键(任何像样的表都有一个),以使每一行都是唯一的。然后你可以为invoicenumber列定义一个自动增量机制(我将回到这个问题)。
首先,我将如下定义发票表:
CREATE TABLE `invoices` (
`id` int unsigned NOT NULL auto_increment,
`invoicenumber` mediumint unsigned NOT NULL,
`invoicetype` enum('A','B') NOT NULL,
`invoicedate` date NOT NULL, -- not recomended to use reserved words for column names like date
`client` varchar(100) NOT NULL,
PRIMARY KEY (id)
) COMMENT='' ENGINE='MyISAM';
然后我会定义另一个表 list_id :
CREATE TABLE `list_id` (
`id` int unsigned NOT NULL auto_increment,
`id_inc` int unsigned NOT NULL, -- number of invoice
`the_year` date NOT NULL, -- year corresponding to the number of invoice
PRIMARY KEY (id)
) COMMENT='' ENGINE='MyISAM';
上表可用于为 invoice 表中插入的当前行设置 invoicenumber 的值(如果它是发票年份的第一张发票,则为1) ,id_inc的最大值(对应于发票年份)加一,否则)。在插入之前,使用类型为的触发器为发票表完成行。因此,在我插入新发票之前,我必须确定invoicenumber的值。它将为1,如果表list_id中没有记录,则列__year的值等于新发票的年份。在这种情况下,我可以在表list_id中插入一个值为(1,2014)(id_inc,year)的新记录。它将是id_inc的最大值加1,如果表list_id中有记录,其中列__year的值等于新发票的年份。在这种情况下,我可以在表list_id中插入一个值为(7,2014)(id_inc,year)的新记录。触发器如下所示:
CREATE TRIGGER `increment_or_reset_new_year`
BEFORE INSERT ON `invoices`
FOR EACH ROW
thisTrigger : begin
declare new_id_year int(11);
declare nr_invoices_year int(11);
declare new_invoice_begin int(11);
declare current_year_row int(11);
set current_year_row = year(new.invoice_date);
set nr_invoices_year = get_nr_invoices_year(current_year_row);
if(get_nr_invoices_year(current_year_row) < 1) then
set new.invoicenumber = 1;
insert into list_id(id_inc,the_year) values (1,current_year_row);
leave thisTrigger;
end if;
if(get_nr_invoices_year(current_year_row) >= 1) then
set new.invoicenumber = get_max_id(year(new.invoice_date)) + 1;
set new_id_year = get_max_id(year(new.invoice_date)) + 1;
insert into list_id(id_inc,the_year) values(new_id_year,year(new.invoice_date));
end if;
end;
触发器中有2个功能。第一个确定list_id表中的行数,其中__year等于当前发票年份(作为参数给出):
create function get_nr_invoices_year(invoice_year int) returns int
begin
declare nr_invoices_year int(11);
select count(*) into nr_invoices_year from lista_id where the_year = invoice_year;
return nr_invoices_year;
end;
第二个确定表list_id中id_inc的最大值,其中the_year的相应值等于当前发票的年份(作为参数给出):
create function get_max_id(year_invoice int) returns int
begin
declare max_id_year int(11);
select max(id_inc) into max_id_year from invoices.lista_id where the_year =year_invoice;
return max_id_year;
end;
所以我可以有一个触发器,两个函数和一个控制invoicenumber增量的表。
希望这可以帮助!它对我有用!
答案 3 :(得分:0)
在您的数据库表中,您可以使用以下代码重置计数器:
ALTER TABLE tablename AUTO_INCREMENT = 1