因為資料量太大所以用存盤程序函式,
采用回圈方式修改表的欄位資料,結果只執行了一部分,沒有完全執行完畢,原因是什么
存盤程序中的回圈體如下:
SET num = CEIL(@count_num/2000000);
a:WHILE i < num DO
SET m = i*2000000;
SET i:= i+1;
SET n = i*2000000;
SET @m = m; SET @n = n;
SET @com=CONCAT("UPDATE ",@tablename_1," a INNER JOIN ",@tablename_2," v ON a.",@var,"= v.",@var," SET a.",@var_read,"= v.id WHERE a.id >",@m," AND a.id <=",@n,";");
簡化一下上面的陳述句:
UPDATE @tablename_1 a INNER JOIN @tablename_2 v
ON a.@var= v.@var SET a.@var_read= v.id WHERE a.id >@m AND a.id <=@n;
PREPARE stmt FROM @com;
-- 執行預定義
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END WHILE a;
這個存盤程序體中的回圈次數已經完全執行完成,結果是@m = 30,000,000 ; @n =32,000,000
被修改的記錄總長度為 @count_num=30,970,574 也在被修改規定的 id 范圍內
執行完這個存盤程序后并沒有出現錯誤提示 ,
首先確定表@tablename_1中被修改的記錄條件100%在參照表中@tablename_2可以找到。
通過查詢
SELECT count(var17) FROM data_min5.fig_min5_9901
WHERE var17 IS not null;
結果被修改的記錄只有 26,210,251條,而不是全部30,970,574記錄
這個也設定了2g SET GLOBAL innodb_buffer_pool_size=2147483648;
請教壇內的老師這是說明原因造成不能完全修改全部記錄
uj5u.com熱心網友回復:
找到原因了,id序號和和記錄長度不相同,記錄多次寫入使得id號遠大于記錄數量,應該重新設定id轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/245868.html
標籤:MySQL
上一篇:這種情況,MySQL索引為啥失效
