SQL:如果假设一个不合适的数字被添加到唯一标识符列,会发生什么?

时间:2014-02-26 21:08:48

标签: mysql sql database

让我们这样想,比如我在MYSQL中有一个名为“names”的表,如下所示:

id| name
1 | Bob
2 | Sally
3 | Anne

其中“id”是表的唯一标识符,并且每增加一行就会自动递增。

说我以某种方式设法在一行中输入一个完全不合适的ID,如下所示:

id| name
1 | Bob
2 | Sally
3 | Anne
20| John

随机行后面的行会从新ID 20继续吗? (例如,添加的下一行有id 21),还是会继续从id 3开始? (例如,添加的下一行有id 4)

之前是否发生过SQl?

2 个答案:

答案 0 :(得分:3)

他们将继续21,这禁止重复。否则,当你达到19并且下一个插入的行应该变为20时,你会遇到问题,这已经存在了。

顺便说一下插入这样一行并不复杂。只需在INSERT上提供特定值,而不是省略自动增量列或移交NULL

除非您手动设置next-autoincrement值,否则MySQL会尽一切努力确保不会发生冲突。因此,如果您插入一个较大的值,它会将此+1保存为下一个自动增量值。

答案 1 :(得分:0)

要查看mysql表的下一个自动增量是什么,请使用

SHOW TABLE STATUS LIKE'tablename';

您将有 Auto_increment 列,其中说明下一个自动增量值是什么。为了测试和好奇,我进行了以下测试:

我创建了表格如下:

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `num` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

然后我进行了以下查询:

INSERT INTO `test` (`id`,`num`) VALUES (NULL,1);
INSERT INTO `test` (`id`,`num`) VALUES (NULL,2);
INSERT INTO `test` (`id`,`num`) VALUES (NULL,3);
INSERT INTO `test` (`id`,`num`) VALUES (50,4);
INSERT INTO `test` (`id`,`num`) VALUES (NULL,5);

输出如下:

mysql> select * from `test`;
+----+------+
| id | num  |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
| 50 |    4 |
| 51 |    5 |
+----+------+
5 rows in set (0.00 sec)

这意味着,在插入自定义值后,Auto_increment也会增加。然后我又执行了一个查询:

INSERT INTO `test` (`id`,`num`) VALUES (100,6);

之后的状态如下

mysql> SHOW TABLE STATUS LIKE 'test';
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation         | Checksum | Create_options | Comment |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| test | InnoDB |      10 | Compact    |    6 |           2730 |       16384 |               0 |            0 |   8388608 |            101 | 2014-02-26 22:12:32 | NULL        | NULL       | latin1_swedish_ci |     NULL |                |         |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
1 row in set (0.00 sec)

您可以看到下一个自动增量值将为101,这意味着MySQL会自动调整为插入的值。

让我知道你的想法。