如何在mysql中重置自动增量值?

时间:2013-10-09 09:29:28

标签: mysql

我公司有不同类型的发票。 例如:

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'; 

4 个答案:

答案 0 :(得分:2)

您可以使用ALTER TABLE语句重置自动增量值。用于重置自动增量值的ALTER TABLE语句的语法如下:

ALTER TABLE table_name AUTO_INCREMENT = VALUE;

<强>编辑:

如果您不想每年运行此查询,那么您还有其他两个选项可以执行此操作,因为我知道这两个。

  1. 创建cron作业/ windows预定作业
  2. 当您使用 MySql 时,会有Event Scheduler(请记住,这是在MySql 5.1.6中添加的,而不是以前的MySql版本中添加)

答案 1 :(得分:2)

嘿,如果你使用任何客户端应用程序的数据库,如MysqlWorkBench或MYSQL查询浏览器 然后你可以在下面的步骤中设置AutoIncrement no -

  • 右键单击Table并转到Alter Table
  • 选择选项标签
  • 在此可以找到自动增量标签,您可以重置该号码。

答案 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