2013-10-09 73 views
1

我的公司有不同類型的發票。例如:如何重置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'; 
+1

Duplicate http://stackoverflow.com/questions/8923114/how-to-reset-auto-increment-in-mysql –

回答

2

您可以通過使用ALTER TABLE語句重置自動增量值。 ALTER TABLE語句的語法來重置自動增量值如下:

ALTER TABLE table_name AUTO_INCREMENT = VALUE; 

編輯:

如果你不想運行此查詢每年那麼你有另外兩個選項做這樣的事情,我知道這兩件事。

  1. 創建cron作業/ Windows的計劃任務
  2. 當你使用MySQL的然後Event Scheduler(請記住,這是在MySQL 5.1.6添加不能在MySQL中的以前的版本)
+0

你的意思是我需要執行該SQL查詢每一個新的一年? – user2862056

+0

@ user2862056是的,您必須每年運行一次此查詢,或者有其他選項,如cron job或Event Scheduler。 –

2

嘿,如果你正在使用像MysqlWorkBench或MySQL查詢瀏覽器 數據庫的任何客戶端應用程序,那麼你可以做以下步驟設置自動增加無 -

  • 右鍵單擊表並轉到ALTER TABLE
  • 選擇選項標籤
  • 下,你可以找到自動遞增標籤那裏你可以重置的數量。
0

也許你已經找到了解決方案,我給出的答案可能沒有用,因爲它已經有七個月了。
回到主題,我注意到你有一個有兩列的組合主鍵(invoicetype,invoicenumber)。 因此,不可能有雙重配對invoicetype,invoicenumber如果您每年重新設置auto_increment,那麼可能會出現重複對像'A',兩行一個,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'; 

上述表可以被用來設置的invoicenumber值爲當前行插入的發票表(如果它是發票年份的第一張發票,則爲id_inc的最大值(與發票的年份一致)pl我們一個,否則)。在爲發票表插入之前,行使用類型的觸發器完成。因此,在插入新發票之前,我必須確定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個功能。第一個確定(給定的參數)從具有the_year等於與當前發票一年LIST_ID表的行數:

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; 

第二個確定哪個具有coresponding值從表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的遞增一個表。
希望這有助於!它爲我工作!