密钥PRIMARY的重复键输入

时间:2014-08-01 15:01:35

标签: mysql primary-key

我是MySQL新手但学习速度很快。我正在学习一个教程,一切顺利,直到我添加了几个记录。我在Workbench 6.1中做这个教程。

本教程要求我这样做:

使用emp_no,first_name和last_name创建一个非常简单的表,其中emp_no是PK,我们插入三条记录:

no  fn      ln
--------------------
1   Daniel  Lamarche
2   Paul    Smith
3   Bobz    Youruncle

然后教程要求我们将第三条记录更新为:

5   Alan    Youruncle

一切都很好。然后它要求我们确认LAST_INSERT_ID()仍然等于3.

该表现在如下所示:

no  fn      ln
--------------------
1   Daniel  Lamarche
2   Paul    Smith
5   Alan    Youruncle

这里我有一个问题,教程没有解决,因为它停在那里。我喜欢冒险,我想知道如果我添加三条记录将会发生什么。由于LAST_INSERT_ID = 3,emp_no将需要3,4,然后6我会问自己。

所以当我插入三条记录时:

INSERT INTO employees (first_name, last_name)
VALUES ('Paul', 'Lalo'), ('Claude', 'Baker'), ('Alan', 'Brown');

我收到错误错误代码:1062。重复输入' 5'关键的PRIMARY。

现在我完全明白为什么会有错误。任何人都可以帮助我理解如何处理这个问题。有没有办法插入新记录并跳过它遇到的值?

现在我也明白,以这种方式或其他方式做这可能不是好习惯。但是,让我们假装这是一个现实生活中的情况,而不仅仅是像我这样的初学者的有趣教程。

以防有人想要啧啧在:http://www.mysqltutorial.org/mysql-sequence/

谢谢, 丹尼尔

2 个答案:

答案 0 :(得分:2)

在大多数现实生活中,您永远不会更新或插入auto_increment主键值,您只需更新或插入其他列值。它只是作为指向行的指针。

当教程要求您将第三条记录更新为:

5   Alan    Youruncle

它只是强调了一个关于LAST_INSERT_ID()行为的观点,但是应该指出这不是你通常应该运行的UPDATE。

如果要完全更改行,通常会执行删除操作,然后执行插入操作。

如果必须,可以将表格上的当前auto_increment值更改为高于当前最大值的值。只有你做了一些不寻常的事情,这才有必要:

ALTER TABLE employees AUTO_INCREMENT=6;

答案 1 :(得分:1)

基本上,当您执行INSERT时,MySQL会更新表AUTO_INCREMENT。当您对"自动增量"执行更新时列MySQL不会更新表AUTO_INCREMENT

因此,

INSERT INTO users(id, name) VALUES(20, 'John');会将AUTO_INCREMENT更新为21,以便下一个插页将具有第21个ID。

但是,如果您执行更新UPDATE users SET id = 40 WHERE id = 20,则AUTO_INCREMENT仍然是21而不是41,而下一个插页将具有第21个ID。如果你最后继续插入,你将再次点击第40个ID,它将引发重复的主键异常。

此外,FWIW,AUTO_INCREMENT更新是在插入之后而不是之前计算和执行的。