gio*_*ano 8 mysql mariadb primary-key auto-increment
我有一个包含自动递增主键 ID 的表。如果我删除最后一行(最高 id,例如 id = 6)并插入新行,则新 id 从 7 开始。我必须更改哪个参数才能使主键从 6 开始?
CREATE TABLE animals (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM;
INSERT INTO animals (name) VALUES
('dog'),('cat'),('penguin'),
('lax'),('whale'),('ostrich');
Run Code Online (Sandbox Code Playgroud)
结果:
id 名称
1 狗
2 猫
3 企鹅
4 松懈
5 鲸鱼
6 鸵鸟
DELETE FROM animals WHERE id = 6;
INSERT INTO animals (name) VALUES
('x');
Run Code Online (Sandbox Code Playgroud)
结果:
id 名称
1 狗
2 猫
3 企鹅
4 松懈
5 鲸鱼
7 x
谢谢你的建议。
Dav*_*ett 12
这是设计使然 - 所有 DBMS 都使用自动增量列。
如果它们没有外部参照完整性可能会被破坏。举一个简单的例子,假设您正在使用自动增量列作为键存储缩短服务的 URL。你不知道缩短的 URL 是否已经提供给任何人,数据库肯定没有,所以重用 ID 1234 可能会导致某人可怜的奶奶在点击http:/时访问 somenastypornsite.xxx 而不是 loverlyknitting.org /shortthi.ng/1234在旧电子邮件中,而不是收到“抱歉,我们的记录中不再存在此链接”消息。
此外,如果您在删除最后一个项目后重置增量,当第 5 个项目被删除时,您是否还会完成所有工作(或期望数据库)在 500 万的第 5 个项目之后重新编号所有内容?完成对其他表的更改,其中它们的外键约束指向增量列?这种额外的工作可能会在 IO 方面变得非常昂贵。
如果你做删除最后一个项目之后重置增量点,别要非常非常小心你的事务隔离级别:你可以将其重置就像其他事务利用的价值,从而导致错误(或更糟的是,静默失败),除非您确保您的操作完全 100% 隔离。
我通常建议使用数据库的人阅读“SQL Antipatterns”,其中有一章关于这个问题的章节名为“Psuedo-Key Neat Freaks”(它以比章节标题对某些人暗示的更友好的方式介绍了这个问题!)。本质上,如果该值的意义不仅仅是作为一个键(或最多携带插入顺序信息),那么它可能不应该是一个自动递增的列,如果它除了作为一个键(或最多携带插入顺序)没有任何意义信息)那么差距应该无关紧要。
归档时间: |
|
查看次数: |
17618 次 |
最近记录: |