在做音視頻網(wǎng)站審核的時(shí)候,發(fā)現(xiàn)分頁(yè)出現(xiàn)了重復(fù)記錄。原以為是自己程序出了問(wèn)題,可仔細(xì)檢查了程序之后,并沒(méi)有發(fā)現(xiàn)有什么不對(duì)的地方,于是上網(wǎng)查了一下,原來(lái)是oracle
          分頁(yè)機(jī)制的問(wèn)題,在oracle中,分頁(yè)是通過(guò)rownum函數(shù)來(lái)實(shí)現(xiàn)的,
          rownum順序號(hào)的生成是排序后生成的,例如下面這條sql:
          select * from user where rownum <= 20 and rownum > 10 order by userName
          按照我們正常的理解,這條sql查詢(xún)的是user表中按照userName升序后取其10~20條記錄,
          其實(shí)不然,oracle是排序后才生成rownum,理想情況下如userName在user表的值是唯一
          的或者userName在數(shù)據(jù)庫(kù)中被建了唯一索引,結(jié)果是正確的,但是如果userName的值存在
          大量重復(fù)記錄或者為空,就會(huì)出現(xiàn)問(wèn)題重復(fù)記錄的情況。正確的sql應(yīng)該這樣寫(xiě):
          select * from (select * from (select * from user order by userName)
          where rownum <= 20) where rownum >=10
          但是這并不能從根本上解決問(wèn)題,為了避免這種情況,建議慎用oracle的排序功能,
          如果需要使用排序,一定要選擇那些建有唯一索引的字段。當(dāng)然有時(shí)候我們可能需要對(duì)
          那些不是唯一索引的字段進(jìn)行排序,這些字段的值可能大量重復(fù)也可能為空,怎么辦,
          這時(shí)候可以采用聯(lián)合字段排序,也就是排序字段中包含一個(gè)主鍵或不會(huì)重復(fù)的字段。

          Feedback

          # re: 使用hibernate對(duì)oracle數(shù)據(jù)庫(kù)中數(shù)據(jù)分頁(yè)出現(xiàn)重復(fù)記錄  回復(fù)  更多評(píng)論   

          2013-07-15 16:56 by 游客
          學(xué)習(xí)了!

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          posts - 146, comments - 143, trackbacks - 0, articles - 0

          Copyright © flustar

          主站蜘蛛池模板: 海宁市| 固原市| 密山市| 砚山县| 南川市| 高碑店市| 汉中市| 白城市| 潜山县| 故城县| 恩平市| 渭南市| 文安县| 元氏县| 富蕴县| 隆尧县| 巩义市| 亳州市| 沙坪坝区| 龙南县| 海林市| 普陀区| 马鞍山市| 亳州市| 塔城市| 平顶山市| 阳谷县| 崇礼县| 黄平县| 张家港市| 客服| 衡阳市| 清苑县| 扬州市| 庆城县| 吴桥县| 繁峙县| 东港市| 临桂县| 通州市| 宁德市|