也許你已經找到了解決方案,我給出的答案可能沒有用,因爲它已經有七個月了。
回到主題,我注意到你有一個有兩列的組合主鍵(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的遞增一個表。
希望這有助於!它爲我工作!
Duplicate http://stackoverflow.com/questions/8923114/how-to-reset-auto-increment-in-mysql –