我是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/
谢谢, 丹尼尔
答案 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
更新是在插入之后而不是之前计算和执行的。