前言

在 MySQL 数据库中,使用自增(AUTO_INCREMENT)字段简化了 ID 的管理,但这也带来一个问题:默认情况下,自增字段无法插入 ID 为 0 的值。在实际应用中,有时我们确实需要插入 ID 为 0 的记录。本文将深入探讨这个问题的成因,并提供几种有效的解决方案,以帮助开发者更灵活地管理数据库中的自增字段。

问题描述

近日利用 MySQL 上进行开发时,通过下面的 SQL 插入一条数据到数据库

INSERT INTO `cmp_helpdesk`.`config_type` (`id`, `type`, `name`, `parent_id`, `creat_user_id`, `update_user_id`, `creation_time`, `updation_time`, `is_deleted`) VALUES (0, 'service', '默认分类', NULL, 5, 5, '2024-04-22 15:36:04', '2024-04-22 15:36:04', 0);

想插入一条 ID 为 0 的数据

但是插入后,发现 ID 不为 0,而是自增的另外一个数字。

解决思路

根据一番搜索发现,在 官方sql_mode配置 找到下面的描述:

默认情况下,自增列插入 null 或者 0 的时候数据库会产生一个新的自增数值。如果想让自增列在只插入 null 的时候产生自增序列。就要提前设置 MySQL 的 sql_mode 包括 NO_AUTO_VALUE_ON_ZERO

可以用以下 SQL 在运行时设置

SET GLOBAL sql_mode = '_modes_'; 
SET SESSION sql_mode = '_modes_';

也可以在 MySQL 的配置文件 my.inimy.cnf 中设置 sql_mode。

总结

在 MySQL 中,虽然自增字段的设计初衷是自动生成唯一的非零 ID,但我们仍然可以通过修改 SQL 语句、调整表定义或设置会话变量来插入 ID 为 0 的记录。掌握这些技巧可以帮助开发者更灵活地操作数据库,满足特定的业务需求。

参考链接

  1. MySQL官方文档:AUTO_INCREMENT
  2. Stack Overflow: How to Insert 0 for an AUTO_INCREMENT Column in MySQL
  3. MySQL Server SQL Modes