5

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

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

4 回答 4

6

嘿,如果您使用任何客户端应用程序用于数据库,如 MysqlWorkBench 或 MYSQL 查询浏览器,那么您可以执行以下步骤来设置 AutoIncrement no -

  • 右键单击表并转到更改表
  • 选择选项选项卡
  • 在此您可以找到自动增量标签,您可以重置数字。
于 2013-10-09T09:42:20.797 回答
5

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

ALTER TABLE table_name AUTO_INCREMENT = VALUE;

编辑:

如果您不想每年都运行此查询,那么您还有其他两个选项可以做我知道这两个的事情。

  1. 创建 cron 作业/windows 计划作业
  2. 当您使用MySql时,会有Event Scheduler(请记住,这是在 MySql 5.1.6 中添加的,而不是在以前版本的 MySql 中添加的)
于 2013-10-09T09:33:11.783 回答
2

在您的数据库表中,您可以使用以下代码重置计数器:

ALTER TABLE tablename AUTO_INCREMENT = 1
于 2020-11-09T08:51:13.153 回答
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如果是invoicedate年份的第一张invoice,id_inc的最大值(对应invoicedate的年份)加一,否则)。在插入之前使用类型触发器完成行对于发票表。因此,在插入新发票之前,我必须确定 invoicenumber 的值。如果表 list_id 中没有列 the_year 的值等于新发票年份的记录,则它将为 1。在这种情况下,我可以在表 list_id 中插入一条新记录,其值为 (1,2014) (id_inc,year)。如果表 list_id 中有记录,列 the_year 的值等于新发票的年份,则它将是 id_inc 的最大值加 1。在这种情况下,我可以在表 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 表中 the_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递增的表。
希望这可以帮助!它对我有用!

于 2014-05-11T22:51:26.587 回答