为什么我不能在MySQL中的索引0处插入一行?

时间:2017-07-09 02:32:46

标签: mysql

我有一个简单的表,其中id列为主键(int)。当我运行此语句时,它会创建一个新行,但具有自动递增的id值:

INSERT INTO `test_table` (`id`,`id_user`,`someString`) VALUES (0, 0, 'Hello World')

产地:

id (pk) | id_user | someString
1       | 0       | Hello World
2       | 0       | Hello World
3       | 0       | Hello World

为什么会这样?我不应该索引为0吗?

2 个答案:

答案 0 :(得分:2)

没试过,但我怀疑你可以 https://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html如果“没有为AUTO_INCREMENT列指定值,那么MySQL会自动分配序列号。除非启用了NO_AUTO_VALUE_ON_ZERO SQL模式,否则还可以显式地为列分配0以生成序列号” 如果你确实指定了一个值,那么mysql将接受它(只要它不会导致主键错误)并且后续插入将正常增加,而不指定它。因此,如果您愿意,可能会创建不连续性。

例如

ariaDB [sandbox]> DROP TABLE IF EXISTS T;
Query OK, 0 rows affected (0.11 sec)

MariaDB [sandbox]> CREATE TABLE T (ID INT AUTO_INCREMENT PRIMARY KEY, VAL VARCHAR(3));
Query OK, 0 rows affected (0.17 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> INSERT INTO T (ID,VAL) VALUES (3,'AAA');
Query OK, 1 row affected (0.02 sec)

MariaDB [sandbox]> INSERT INTO T (ID,VAL) VALUES (2,'CCC');
Query OK, 1 row affected (0.02 sec)

MariaDB [sandbox]> INSERT INTO T (ID,VAL) VALUES(1,'BBB');
Query OK, 1 row affected (0.04 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> INSERT INTO T (VAL) VALUES ('DDD');
Query OK, 1 row affected (0.04 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> INSERT INTO T (ID,VAL) VALUES (10,'EEE');
Query OK, 1 row affected (0.01 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> INSERT INTO T (VAL) VALUES ('FFF');
Query OK, 1 row affected (0.02 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> SELECT * FROM T;
+----+------+
| ID | VAL  |
+----+------+
|  1 | BBB  |
|  2 | CCC  |
|  3 | AAA  |
|  4 | DDD  |
| 10 | EEE  |
| 11 | FFF  |
+----+------+
6 rows in set (0.00 sec)

答案 1 :(得分:1)

不要尝试写入自动增量字段。 MySql索引始终以1开头。如果您对索引的某些操作需求为0,那么您必须为每个新记录创建自己的索引。