2017-07-09 29 views
1

我有一个简单的表,其中id列作为主键(int)。当我运行该语句,它会创建一个新的行,但是有一个自动递增id值:为什么我不能在MySQL的索引0处插入一行?

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?

回答

1

千万不要试图写入自动增量字段。 MySql索引始终以1开头。如果您有一些索引为0的操作需求,则必须为每个新记录创建自己的索引。

+0

当我问到插入/更新的索引为0那么发生了什么?为什么它会创建一个新行而不是给我一个错误? – GoldenJoe

+0

我认为它忽略了你试图插入的值,只是分配一个新行。 – Difster

2

没有尝试过这一点,但我怀疑你可以 https://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html如果“为AUTO_INCREMENT列指定任何值,因此MySQL自动分配的序列号。您也可以明确分配0到列生成的序列号,除非NO_AUTO_VALUE_ON_ZERO启用SQL模式“ 如果您确实指定了一个值,那么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) 
相关问题