php mysqli_multi_query 執行多筆 sql 指令 -- update 多筆用
在 update 不同值時, mysqli_query 只能一筆一筆更新,時間效率都很差,上網找的方法是產生一個更新資料暫存表,再用唯一值一次更新.
經過重覆測試,指令如下:
$sql1 = "CREATE TABLE IF NOT EXISTS `std_pnum` ( //產生暫存,最後沒有刪除,想說都要用
`stdno` varchar(10) NOT NULL,
`subjno` text NOT NULL,
`class` varchar(6) DEFAULT NULL,
`grade` varchar(8) DEFAULT NULL,
`seme` varchar(6) DEFAULT NULL,
`pnum` smallint(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
$sql1 .= "delete from std_pnum ;"; //一開始先清空 tmp表
$sql1 .= "set @count := $bnum ; "; //設定開始更新值,由 php 代入
,宣告變數要用 set 或 select ,不可用 declare (在有 begin - end 內才可以用,一開始用 Declare 在這裡卡好久)
//用現有資料,利用 stdno 當唯一值,相同同編號,因為 @count := @count + 1 會跟來源變動,所以用子查詢我方式,將來源先轉成單純的唯一值排序,這樣@count 才會正常累加
$sql2 = "insert into std_pnum
select c.stdno,c.subjno,c.class,c.grade,c.seme, @count := @count + 1 from
(select a.* from pig_reopen_std a LEFT JOIN student b ON a.stdno = b.stdno
WHERE a.indate >= '{$config['okdate']}' AND
a.syear={$config['syear']} AND ((a.delete_yn<>'Y') Or (a.delete_yn
Is Null)) AND a.pnum <= 0
group by a.stdno
ORDER BY b.classno,b.seat,a.stdno,a.subjno,a.class,a.grade,a.seme) c ; ";
//直接用產生的暫存表更新
$sql3 = "update pig_reopen_std a ,std_pnum b set a.pnum=b.pnum where a.stdno = b.stdno ;";
$sql = $sql1 . $sql2 . $sql3 ;
if (mysqli_multi_query($link, $sql)) { //執行sql
do {
mysqli_free_result($result);
if (mysqli_more_results($link))
{
$up_num = mysqli_affected_rows ( $link ); //取得最後更新筆數
}
} while (mysqli_next_result($link));
}
本來更新350筆要14秒,現在馬上完成,顯示0秒