MySQL错误1062排查:admin_menu表主键重复插入问题
MySQL ERROR 1062 (23000) 主键重复问题解决
问题原因
admin_menu表的id字段是主键(建表语句中的AUTO_INCREMENT隐含其为主键属性),主键值必须唯一。执行插入语句时,尝试插入id=1的记录,但表中已存在该主键值的记录,因此触发重复键错误。
解决方法
1. 跳过重复记录,保留现有数据
修改INSERT语句,添加ON DUPLICATE KEY UPDATE子句,遇到主键重复时可选择跳过或更新现有记录:
- 仅跳过重复记录(不做任何更新):
INSERT INTO `admin_menu` (`id`, `parent_id`, `order`, `title`, `icon`, `uri`, `permission`, `created_at`, `updated_at`) VALUES (1, 0, 1, 'Dashboard', 'fa-bar-chart', '/', NULL, NULL, NULL), (2, 0, 2, 'Admin', 'fa-tasks', '', NULL, NULL, NULL), (3, 2, 3, 'Users', 'fa-users', 'auth/users', NULL, NULL, NULL), (4, 2, 4, 'Roles', 'fa-user', 'auth/roles', NULL, NULL, NULL), (5, 2, 5, 'Permission', 'fa-ban', 'auth/permissions', NULL, NULL, NULL), (6, 2, 6, 'Menu', 'fa-bars', 'auth/menu', NULL, NULL, NULL), (7, 2, 7, 'Operation log', 'fa-history', 'auth/logs', NULL, NULL, NULL), (8, 0, 0, 'Food Category', 'fa-certificate', '/food-types', '*', '2021-11-08 04:58:13', '2022-01-01 00:16:59'), (10, 0, 0, 'Users', 'fa-bars', '/users', '*', '2021-11-08 05:38:59', '2021-11-08 05:38:59'), (11, 0, 0, 'Food', 'fa-beer', '/foods', '*', '2021-11-17 01:37:06', '2022-01-01 00:06:15'), (12, 0, 0, 'Orders', 'fa-first-order', '/orders', '*', '2022-02-09 18:27:25', '2022-02-09 18:27:25'), (13, 0, 0, 'Payment Setting', 'fa-dollar', '/business-settings', '*', '2022-02-27 22:24:23', '2022-02-27 22:24:23') ON DUPLICATE KEY UPDATE id=id;
- 若需更新重复记录的字段(例如更新
updated_at和title):
ON DUPLICATE KEY UPDATE updated_at=VALUES(updated_at), title=VALUES(title);
2. 清空表后重新插入数据
如果表中现有数据无需保留,可先清空表再执行插入:
TRUNCATE TABLE `admin_menu`; -- 执行原INSERT语句
TRUNCATE会清空表并重置自增计数器,适合完全重建数据的场景。
3. 删除重复主键记录后插入
先查询并删除已存在的id=1记录,再执行插入:
-- 查询是否存在重复记录 SELECT * FROM `admin_menu` WHERE id=1; -- 删除重复记录 DELETE FROM `admin_menu` WHERE id=1; -- 执行原INSERT语句
建表语句优化建议
建表时显式声明id为主键,使表结构更清晰:
CREATE TABLE IF NOT EXISTS `admin_menu` ( `id` int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT, `parent_id` int NOT NULL DEFAULT '0', `order` int NOT NULL DEFAULT '0', `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `icon` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `uri` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `permission` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
内容的提问来源于stack exchange,提问作者Mostafa Mohamed
相关产品推荐
相关产品推荐

