帝國CMS後臺新增資訊報錯Duplicate entry xx for key PRIMARY

黄文Rex發表於2024-10-05

當在帝國CMS後臺新增資訊時遇到 Duplicate entry 'xx' for key 'PRIMARY' 的錯誤時,通常是因為主鍵衝突。以下是一些解決該問題的方法:

方法 1:後臺修復資料庫

  1. 進入後臺

    • 登入帝國CMS後臺。
    • 進入 系統 -> 備份與恢復資料 -> 備份資料
  2. 修復資料表

    • 在頁面底部,找到 修復資料表和最佳化資料表 的選項。
    • 點選 修復資料表

方法 2:插入一個大於當前索引的資訊

如果後臺修復沒有解決問題,可以透過手動或 SQL 插入一個大於當前索引的資訊,使索引 ID 重新遞增。

  1. 手動操作

    • 直接在資料庫中插入一條新的記錄,ID 填一個大於當前最大 ID 的值。
  2. SQL 插入

    sql
    INSERT INTO `phome_ecms_news` VALUES (3262, 1, 1, '', '', '', 1, 'admin', '', 1, 0, 1333244472, 0, 1, 0, 0, ',b|', '', '1', 0, 0, 0, 0, 0, 0, '帝國cms模板', 1333244427, '', 0, 1, 1350716513, 0, 0, 0, 0, '', '帝國cms模板網', 0, '1', '', 0, '', 0);
    • 第一個欄位 3262 是索引 ID,後面的欄位根據實際情況調整。

方法 3:批次重新生成索引

如果以上方法仍然無效,可以嘗試使用 SQL 語句重新生成索引。

  1. 建立臨時表

    sql
    CREATE TABLE [!db.pre!]ecms_newstemp AS (SELECT id, classid, newstime, truetime, lastdotime, havehtml FROM [!db.pre!]ecms_news);
  2. 新增 checked

    sql
    ALTER TABLE `[!db.pre!]ecms_newstemp` ADD COLUMN `checked` tinyint(1) NOT NULL DEFAULT 0 AFTER `classid`;
  3. 新增主鍵

    sql
    ALTER TABLE `[!db.pre!]ecms_newstemp` ADD PRIMARY KEY (`id`);
  4. 重新命名舊錶

    sql
    ALTER TABLE [!db.pre!]ecms_news_index RENAME TO [!db.pre!]ecms_news_indexbak;
  5. 重新命名臨時表

    sql
    ALTER TABLE [!db.pre!]ecms_newstemp RENAME TO [!db.pre!]ecms_news_index;
  6. 設定自增主鍵

    sql
    ALTER TABLE `[!db.pre!]ecms_news_index` CHANGE `id` `id` INT(10) NOT NULL AUTO_INCREMENT;
  7. 新增索引

    sql
    ALTER TABLE `[!db.pre!]ecms_news_index` ADD INDEX (classid); ALTER TABLE `[!db.pre!]ecms_news_index` ADD INDEX (checked); ALTER TABLE `[!db.pre!]ecms_news_index` ADD INDEX (newstime); ALTER TABLE `[!db.pre!]ecms_news_index` ADD INDEX (truetime);
  8. 更新 checked 欄位

    sql
    UPDATE [!db.pre!]ecms_news_index SET checked = 1;

總結

  1. 後臺修復資料庫:適用於輕微的資料問題。
  2. 插入一個大於當前索引的資訊:適用於簡單的索引衝突。
  3. 批次重新生成索引:適用於複雜的資料問題,需要謹慎操作。

透過以上方法,可以解決 Duplicate entry 'xx' for key 'PRIMARY' 的問題。

相關文章