Ms7 Search
Google 搜尋 翻譯
calendar
« 四月 2026 »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      
近期文章
文章分類
網站連結
Syndicate

php mysqli_multi_query 執行多筆 sql 指令 -- update 多筆用

2020-09-10 @ 21:14 in PHP, JavaScript, Sql

在 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秒

引用

引用本文的文章標題:php mysqli_multi_query 執行多筆 sql 指令 -- update 多筆用