mysql字段是自动增长类型结果却不是连续的

本文探讨了MySQL中自增ID字段在遇到唯一性约束错误时的行为特点,并通过实例展示了即使插入失败,自增ID也会继续递增的现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      今天建了一张表,设置其"id"属性为自动增加类型,但是在查看所有数据的时候,却发现"id"的值不是连续增加的。建表的语法如下:
mysql> create table person_list
    -> (
    ->     id        int        auto_increment    unique,
    ->    name    varchar(15)   not null,
    ->    sex     varchar(15)   default "中",
    ->    ID_C    varchar(20)   not null           unique,
    -> vocation   varchar(8),
    ->   salary   float         default 0.0
    -> )charset=utf8;
Query OK, 0 rows affected (0.09 sec)

mysql> desc person_list;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| name     | varchar(15) | NO   |     | NULL    |                |
| sex      | varchar(15) | YES  |     | 中      |                |
| ID_C     | varchar(20) | NO   | UNI | NULL    |                |
| vocation | varchar(8)  | YES  |     | NULL    |                |
| salary   | float       | YES  |     | 0       |                |
+----------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

mysql>
之后我往这张表里面添加了一些数据,从中可以看出我所说的问题
mysql> select * from person_list;
+----+-----------+------+--------------------+--------------+---------+
| id | name      | sex  | ID_C               | vocation     | salary  |
+----+-----------+------+--------------------+--------------+---------+
|  1 | 诸葛亮    | 男   | 360428199908230544 | 蜀国         | 8654.56 |
|  2 | 关羽      | 男   | 360428198908230544 | 蜀国         |  86.236 |
|  3 | 貂蝉      | 女   | 361428198908231479 | 美女集团     | 4566.02 |
|  4 | 西施      | 女   | 795410365478901234 | 美女集团     |   124.1 |
|  5 | 雷军      | 男   | 469787036544025984 | 小米公司     |  1784.1 |
|  6 | 乔布斯    | 男   | 456982103749651024 | 苹果公司     | 88888.9 |
|  7 | 李白      | 中   | 147852036978410210 | NULL         |       0 |
| 10 | 乔布儿    | 男   | 456902103749651024 | 苹果公司     | 88888.9 |
| 13 | 乔布儿    | 男   | 056902103749651024 | 苹果公司     | 88888.9 |
+----+-----------+------+--------------------+--------------+---------+
9 rows in set (0.00 sec)

mysql> 
如果我现在再插入一条记录,那么这个新增加的记录的"id"值会是14
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
Query OK, 1 row affected (0.05 sec)

mysql> select * from person_list;
+----+-----------+------+--------------------+--------------+---------+
| id | name      | sex  | ID_C               | vocation     | salary  |
+----+-----------+------+--------------------+--------------+---------+
|  1 | 诸葛亮    | 男   | 360428199908230544 | 蜀国         | 8654.56 |
|  2 | 关羽      | 男   | 360428198908230544 | 蜀国         |  86.236 |
|  3 | 貂蝉      | 女   | 361428198908231479 | 美女集团     | 4566.02 |
|  4 | 西施      | 女   | 795410365478901234 | 美女集团     |   124.1 |
|  5 | 雷军      | 男   | 469787036544025984 | 小米公司     |  1784.1 |
|  6 | 乔布斯    | 男   | 456982103749651024 | 苹果公司     | 88888.9 |
|  7 | 李白      | 中   | 147852036978410210 | NULL         |       0 |
| 10 | 乔布儿    | 男   | 456902103749651024 | 苹果公司     | 88888.9 |
| 13 | 乔布儿    | 男   | 056902103749651024 | 苹果公司     | 88888.9 |
| 14 | 马云      | 男   | 444989898784562304 | 淘宝公司     | 54588.9 |
+----+-----------+------+--------------------+--------------+---------+
10 rows in set (0.00 sec)

mysql> 
然后我故意输入10条错误的语句(这个表的ID_C值不能重复)
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
之后我又增加1条正确的记录,结果发现该新记录的"ID"值是25,最后一条 跟 倒数第二条 的"ID"值刚好是11-1=10
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云的儿子","男","444989898784562305","淘宝公司",54588.85124);
Query OK, 1 row affected (0.04 sec)

mysql> select * from person_list;
+----+-----------------+------+--------------------+--------------+---------+
| id | name            | sex  | ID_C               | vocation     | salary  |
+----+-----------------+------+--------------------+--------------+---------+
|  1 | 诸葛亮          | 男   | 360428199908230544 | 蜀国         | 8654.56 |
|  2 | 关羽            | 男   | 360428198908230544 | 蜀国         |  86.236 |
|  3 | 貂蝉            | 女   | 361428198908231479 | 美女集团     | 4566.02 |
|  4 | 西施            | 女   | 795410365478901234 | 美女集团     |   124.1 |
|  5 | 雷军            | 男   | 469787036544025984 | 小米公司     |  1784.1 |
|  6 | 乔布斯          | 男   | 456982103749651024 | 苹果公司     | 88888.9 |
|  7 | 李白            | 中   | 147852036978410210 | NULL         |       0 |
| 10 | 乔布儿          | 男   | 456902103749651024 | 苹果公司     | 88888.9 |
| 13 | 乔布儿          | 男   | 056902103749651024 | 苹果公司     | 88888.9 |
| 14 | 马云            | 男   | 444989898784562304 | 淘宝公司     | 54588.9 |
| 25 | 马云的儿子      | 男   | 444989898784562305 | 淘宝公司     | 54588.9 |
+----+-----------------+------+--------------------+--------------+---------+
11 rows in set (0.00 sec)

mysql> 
所以我估摸着,在插入记录  语句错误的时候  自动增长类型的值会依旧增加,不是只有正确的时候才会+1。
<think>嗯,用户想在MySQL中创建一个带有自ID和唯一字段的表。我需要详细说明步骤,同时确保正确使用语法和注意事项。首先,自ID通常用AUTO_INCREMENT属性,而且通常作为主键。主键本身就是唯一的,所以不需要额外指定UNIQUE。然后,用户可能还需要其他唯一字段,比如用户名或邮箱,这时候需要在那些字段上加UNIQUE约束。 接下来,我得考虑建表语句的结构。比如,创建表的时候,指定id列为主键且自,然后其他字段如username或email设置为UNIQUE。需要举一个例子,这样用户能更清楚。例如: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE, email VARCHAR(100) UNIQUE ); 这样id会自动,并且username和email都是唯一的,防止重复。 然后,用户可能会遇到自字段的问题,比如插入重复值。比如如果手动插入一个id值,而该值已经存在,会导致主键冲突。这时候需要提醒用户避免手动指定自字段,或者确保插入的值不存在。例如引用中的错误1062就是因为主键重复了。 另外,如果用户使用CREATE TABLE ... SELECT语句,在启用GTID时可能会报错,这时候应该改用CREATE TABLE后单独插入数据。比如引用3提到的问题,需要改用其他方法。 还要注意表名不能使用关键字,比如DROP、ALTER等,如引用4所述。所以表名和字段名要避开这些保留字,或者用反引号括起来。 可能用户还想知道如何修改现有表来添加自或唯一约束。这时候可以用ALTER TABLE语句,比如添加自主键或唯一索引。例如: ALTER TABLE users ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY; ALTER TABLE users ADD UNIQUE (username); 最后,需要总结注意事项,比如自字段类型通常是整数,复合唯一约束的使用,以及性能方面的考虑,比如唯一索引对插入速度的影响。 相关问题部分,用户可能对自ID的起始值调整、复合唯一约束、主键与唯一键的区别,以及处理插入冲突的方法感兴趣。这些问题可以作为后续的扩展,帮助用户更深入理解。</think>### 创建包含自ID和唯一字段MySQL表 #### 1. 基础语法与示例 使用 `AUTO_INCREMENT` 定义自主键,`UNIQUE` 约束定义唯一字段: ```sql CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, -- 自主键 username VARCHAR(50) UNIQUE, -- 唯一字段 email VARCHAR(100) UNIQUE, -- 第二个唯一字段 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` - **自特性**: 插入数据时无需指定 `id`,系统自动生成连续整数值[^1] - **唯一性约束**: 若插入重复的 `username` 或 `email` 会触发 `ERROR 1062 (23000)`[^1] #### 2. 关键参数说明 | 参数 | 作用 | 注意事项 | |-----------------|--------------------------------|---------------------------------| | `AUTO_INCREMENT` | 自动生成连续唯一ID | 仅限整数类型字段(INT/BIGINT等) | | `UNIQUE` | 保证字段值唯一性 | 可定义多个,支持复合唯一约束 | | `PRIMARY KEY` | 主键默认包含唯一和非空约束 | 每表只能有一个主键 | #### 3. 进阶用法 **复合唯一约束**: ```sql CREATE TABLE orders ( order_id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, product_code VARCHAR(20), UNIQUE KEY (user_id, product_code) -- 组合唯一约束 ); ``` **修改已有表**: ```sql -- 添加自主键 ALTER TABLE employees ADD COLUMN emp_id INT AUTO_INCREMENT PRIMARY KEY FIRST; -- 添加唯一约束 ALTER TABLE products ADD UNIQUE (sku_number); ``` #### 4. 常见错误处理 - **自值冲突**: 手动插入超过当前自计数器的值会导致后续插入失败,可通过重置解决: ```sql ALTER TABLE users AUTO_INCREMENT = 1000; ``` - **GTID限制**: 使用 `CREATE TABLE ... SELECT` 时若报错 `ERROR 1786`,改用两步操作[^3]: ```sql CREATE TABLE new_table LIKE old_table; INSERT INTO new_table SELECT * FROM old_table; ``` #### 5. 性能建议 - 自主键建议使用 `BIGINT UNSIGNED` 应对大数据量 - 唯一索引会增加写入时的校验开销,高频写入场景需评估影响[^2] - 避免在超长文本字段(VARCHAR(255)+)上建立唯一约束
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值