Mysql字段自增,通常用于表的主鍵,用來確保每次插入一條新數(shù)據(jù)的時(shí)候,該列的值在表中是一個(gè)唯一值,該字段通常設(shè)置為主鍵+自增,PRIMARY KEY (ID) AUTO_INCREMENT。
但是今天在重啟一個(gè)之前的功能的時(shí)候,竟然報(bào)錯(cuò)了。這個(gè)表之前是記錄用戶的操作記錄的一個(gè)LOG表,內(nèi)容很多很長,中間有一段時(shí)間已經(jīng)不用了因?yàn)檎加每臻g和影響效率,最近想要重新開始繼續(xù)記錄用戶的操作記錄,結(jié)果就是重啟之后,插入log記錄的時(shí)候就報(bào)錯(cuò)了:Duplicate entry for key 'PRIMARY' .這段報(bào)錯(cuò)的意思就是主鍵id重復(fù)了。當(dāng)時(shí)就有點(diǎn)懵,因?yàn)槲矣浀檬菦]有指定主鍵id的值,應(yīng)該是自增,咋會(huì)報(bào)這個(gè)錯(cuò)。
知道報(bào)錯(cuò)的原因,那么解決這個(gè)報(bào)錯(cuò)的思路就很清晰了,我們可以有多種方式來解決:
1、如果是在寫入的時(shí)候指定了id的值,那么我們就應(yīng)該是不指定id的值,讓mysql自動(dòng)處理自增。
2、重置自增字段,使用alter table重置自增字段。
3、使用insert ignore來忽略重復(fù)的插入操作,改成更新內(nèi)容
但是,我這個(gè)情況好像不在其中。因?yàn)槲覜]有指定id,但是我也不想通過ignore來忽略這個(gè)報(bào)錯(cuò),我覺得可能是表的問題,我決定修復(fù)一下表結(jié)構(gòu)。在mysql中,我們可以使用repair table 來修復(fù) myisam 和 innodb類型的表,mysql還提供check table來檢測表是否存在錯(cuò)誤或者損壞。
在我執(zhí)行了repair table修復(fù)表之后,在測一測是否可以正常插入新數(shù)據(jù)的時(shí)候就發(fā)現(xiàn)可以正常寫入數(shù)據(jù)了。所以在我們遇到這種報(bào)錯(cuò)的時(shí)候,如果我門的代碼沒有問題的時(shí)候,可以check table來檢測一下表時(shí)候有問題,并且使用repair table來修復(fù)表嘗試是否可以解決問題。