修復 Discuz! 從 7.2 轉換到 X 時的資料庫錯誤

轉換工具提示重複主鍵

使用轉換工具進行轉換時,會遇到莫名的主鍵重複錯誤,提示 #1062 - Duplicate entry '...' for key PRIMARY。一番找尋,相關的結果都說「刪掉了就好了」,問題是刪了一個又出一個,最後逼得淺羽直接用 SQL 批量刪了五六千條,下一個還是有問題。

然而原來的資料庫也是 MariaDB,也指定了 PRIMARY KEY,怎麼會重複呢?

囧,这个是转换程序的一个Bug,
我开始的想法和你一样,删除重复的记录,
结果没用,其它记录又会出错,
后来才知道是因为转换程序里的SQL语句没有order by,
所以…

CzBiX 2011-04-24
Discuz7.2升级至DX1.5数据表转换时出错的解决方法

知道了原理,修復起來就比較簡單了:

--- Discuz_X1.5_SC_UTF8/utility/convert/source/d7.2_x1.5/table/posts.php    2011-12-20 16:58:50.000000000 +0800
+++ bbs/convert/source/d7.2_x1.5/table/posts.php                            (new)
@@ -20,7 +20,7 @@
        $db_target->query("TRUNCATE $table_target");
 }

-$query = $db_source->query("SELECT * FROM $table_source WHERE pid>'$start' LIMIT $limit");
+$query = $db_source->query("SELECT * FROM $table_source WHERE pid>'$start' ORDER BY pid ASC LIMIT $limit");
 while($row = $db_source->fetch_array($query)) {
        $nextid = $row['pid'];
        $row = daddslashes($row, 1);

保存,再執行轉換程序,這次就很順利了。

發佈回覆

你的電郵地址並不會被公開。 必要欄位標記為 *

本網誌採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網誌訪客的留言資料