在上星期完成的登錄界面上發(fā)現(xiàn)了一個(gè)問(wèn)題,如果注冊(cè)帳號(hào)由于用戶名已存在等問(wèn)題注冊(cè)不成功,即賬戶密碼數(shù)據(jù)并未添加到數(shù)據(jù)庫(kù)中,但設(shè)置的自增字段id還是會(huì)自動(dòng)增加杠巡,這就導(dǎo)致了在下一次注冊(cè)成功后id字段會(huì)出現(xiàn)不連續(xù)的問(wèn)題,刪除數(shù)據(jù)后也導(dǎo)致id不連續(xù)雇寇。
在API上看了一遍PreparedStatement氢拥,發(fā)現(xiàn)沒(méi)有相應(yīng)的方法,倒是在網(wǎng)上了找到了幾個(gè)方法锨侯,但試了之后也都沒(méi)起效果兄一,不過(guò)最后還是找到了一條MySQL的語(yǔ)句來(lái)實(shí)現(xiàn)
ALTER TABLE table AUTO_INCREMENT =1;
執(zhí)行之后,不一定再插入的id就是1识腿,而是表中id最大值+1出革。
每次執(zhí)行需要和操作語(yǔ)句一起執(zhí)行
eg:
alter table login AUTO_INCREMENT = 1;
insert into login(user_name,password) values ('aaaa', md5(123123));
到這里,問(wèn)題就變的異常簡(jiǎn)單了:在每次插入之后都重置AUTO_INCREMENT的值渡讼。
但是這樣又會(huì)引出一個(gè)問(wèn)題骂束,java語(yǔ)句中調(diào)用sql語(yǔ)句每次只能寫一條:
pStatement = connection.prepareStatement("insert into login(user_name,password) values(?, ?)");
為了保證兩條語(yǔ)句同時(shí)執(zhí)行必須將sql語(yǔ)句在一個(gè)對(duì)象中,即
pStatement = connection.prepareStatement("alter table login AUTO_INCREMENT=1; insert into login(user_name,password) values(?, ?)");
但這樣寫的話就會(huì)出現(xiàn)MySQL語(yǔ)法報(bào)錯(cuò)成箫,又查找了一番之后找到了一個(gè)最為簡(jiǎn)單的解決辦法:在MySQL的連接字符串中設(shè)置allowMultiQueries參數(shù)置為true展箱,允許MySQL批量更新。在jdbc下設(shè)置連接字符串的時(shí)候加上&allowMultiQueries=true蹬昌,即可完成MySQL的批量更新混驰。這樣幾個(gè)問(wèn)題就都得到解決了。