搜尋

首頁  >  問答  >  主體

java - 判斷資料在資料庫中是否已存在.

今天下午和同事發生因為判斷數據是否在數據庫中已存在產生分歧.簡易代碼如下:

    //观点一,先取出数据库中已存在ID存入内存,再进行判断
    //数据太多情况,内存爆炸
    DateTable dt = ExcuteSQL('SELECT ID FROM TABLE');
    
    //List为数据集,已经去重
    foreach(var item in List){
        //观点二,在for循环中根据ID查询是否已存在
        //for循环执行数据库?没这么干过
        DateTable dt = ExcuteSQL(string.format('SELECT ID FROM TABLE WHERE ID = {0}',item.ID));
        
        //判断是否在dt中存在
        ...
        bool ISContain
        ...
        //不存在
         if(!ISContain){
             //加入事物SQL列表
             SQLList.Add('INSERT INTO ........');
         }
    }
    
    //执行事物
    ....

怪我咯怪我咯2804 天前977

全部回覆(6)我來回復

  • 迷茫

    迷茫2017-04-18 10:56:26

    其實第一個你要拿實際資料量來估算,如果ID是Long類型,資料量100W,也才只有 8byte * 100W = 7.629 megabytes。

    第二個肯定要不得,在循環中對每個ID去查詢。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:56:26

    推薦方法二,但這樣做查詢會比較快:

    SELECT id FROM table WHERE id IN (?, ?, ?, ...)
    

    注意,不同的資料庫對參數是有限制的,?最好不要超過1千個。如果你需要判斷1萬個id,就用10次這樣的查詢。

    回覆
    0
  • 黄舟

    黄舟2017-04-18 10:56:26

    利用 @auntyellow 同學所說的方法應該比較好,批量查詢。當ID比較多時,考慮是否可以按其它的批量去查?例如一次拿一段時間的所有id,把方法一稍加改進來實現。
    感覺不管是方法一還是方法二都走了極端,所以好的解決方法應該是中合兩者的結果。

    回覆
    0
  • 黄舟

    黄舟2017-04-18 10:56:26

    https://www.zhihu.com/questio...

    回覆
    0
  • 怪我咯

    怪我咯2017-04-18 10:56:26

    建議是使用先把id從資料庫中取出來,然後在記憶體中比較的方法,這樣可以減少資料庫的存取。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 10:56:26

    可不可以分段 取到記憶體 這樣能減輕記憶體佔用

    回覆
    0
  • 取消回覆