mysql - 键 PRIMARY 的重复键输入

标签 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。 key PRIMARY 的重复条目“5”。

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

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

以防万一有人想看图:http://www.mysqltutorial.org/mysql-sequence/

谢谢, 丹尼尔

最佳答案

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

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

5   Alan    Youruncle

它只是强调关于 LAST_INSERT_ID() 行为的一点,但应该指出这不是您通常应该运行的更新。

如果你想完全改变一行,你通常会先删除再插入。

如果必须,您可以将表上的当前 auto_increment 值更改为比当前最大值高的值。但是,只有在您做了一些不寻常的事情时才需要这样做:

ALTER TABLE employees AUTO_INCREMENT=6;

关于mysql - 键 PRIMARY 的重复键输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25083129/

相关文章:

php - MySQL order by 哪里大于按字母顺序排列的短语?

java - MySQL Java 更新语法

python - zlib.crc32 或 zlib.adler32 可以安全地用于屏蔽 URL 中的主键吗?

sql-server - SQL Server - 更改 PK 数据类型的最佳方法是什么?

php - 点击特定按钮后,访客 IP 被禁止 24 小时

mysql - 在 MySQL 中,有没有办法在对列进行排序之前对其进行修改?

mysql - 有没有一种简单的捆绑方式来安装 Django、Python、Apache、MySQL/PostreSQL?

mysql - 主键可以为空吗?如果是,为什么这个改变会导致这个结果?

sql - 用人的身份证作为主键实用吗?

database-design - 使用数据库表的 ID 作为外部 API 标识符是不是一个坏主意?