文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美國信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  複製與 AUTO_INCREMENT

19.5.1.1 複製與 AUTO_INCREMENT

根據下列例外情況,對 AUTO_INCREMENTLAST_INSERT_ID()TIMESTAMP 值的基於陳述式的複製會執行

  • 呼叫觸發程序或函數的陳述式會導致 AUTO_INCREMENT 資料行更新,使用基於陳述式的複製時不會正確複製。這些陳述式標示為不安全。(錯誤 #45677)

  • INSERT 插入具有複合主索引鍵(包含 AUTO_INCREMENT 資料行,但不是此複合索引鍵的第一個資料行)的資料表,對於基於陳述式的記錄或複製是不安全的。這些陳述式標示為不安全。(錯誤 #11754117, 錯誤 #45670)

    此問題不會影響使用 InnoDB 儲存引擎的資料表,因為具有 AUTO_INCREMENT 資料行的 InnoDB 資料表至少需要一個索引鍵,其中自動遞增資料行是唯一或最左邊的資料行。

  • 在具有 ALTER TABLE 的資料表新增 AUTO_INCREMENT 欄位,可能無法在複本和來源上產生相同的資料列排序。這是因為資料列編號的順序取決於用於資料表的特定儲存引擎,以及資料列插入的順序。如果來源和複本的順序相同很重要,則必須在分配 AUTO_INCREMENT 編號之前對資料列進行排序。假設您想將 AUTO_INCREMENT 欄位新增至具有 col1col2 欄位的資料表 t1,以下陳述式會產生一個新的資料表 t2,它與 t1 相同,但具有 AUTO_INCREMENT 欄位

    CREATE TABLE t2 LIKE t1;
    ALTER TABLE t2 ADD id INT AUTO_INCREMENT PRIMARY KEY;
    INSERT INTO t2 SELECT * FROM t1 ORDER BY col1, col2;
    重要

    為保證來源和複本的排序相同,ORDER BY 子句必須指定 t1所有欄位。

    剛剛提供的說明受限於 CREATE TABLE ... LIKE 的限制:外鍵定義會被忽略,DATA DIRECTORYINDEX DIRECTORY 資料表選項也會被忽略。如果資料表定義包含任何這些特性,請使用與用於建立 t1 的陳述式相同的 CREATE TABLE 陳述式建立 t2,但要額外加上 AUTO_INCREMENT 欄位。

    無論使用何種方法建立和填入具有 AUTO_INCREMENT 欄位的副本,最後一步都是刪除原始資料表,然後重新命名副本

    DROP t1;
    ALTER TABLE t2 RENAME t1;

    另請參閱 第 B.3.6.1 節,〈ALTER TABLE 的問題〉