当然,如果我最终放入足够的行会有重复。但是我们假设我选择了一个足够大的id字段。
我想知道我是否可以假设id随着时间的推移唯一地标识该行。如果客户端向我发送了一个id,我希望能够确定它所引用的行或者该行是否被删除(或者它是否为假id,但在这种情况下我不会在意,错误地说,该行是删除)。
请参阅以下内容:如果我重新启动数据库,或备份和恢复 - 是否会继续创建它离开的地方 - 或者可能会决定“填补漏洞”
答案 0 :(得分:4)
如果您从未重置过“int not null auto increment primary key”,则不会重复使用yes ID。
然而,这提出了一个有趣的问题 - 如果你碰巧重用旧的ID会发生什么?(即使它在MySQL中默认不会发生,但人为因素总是很重要)? / p>
如果您的数据库已正确规范化,则级联和约束您的应用程序应该能够处理ID的重用。 编辑(因为您编辑了帖子,我会充实我的答案),关于这句话:“如果客户端发给我一个ID,我希望能够确定它引用的行或者行被删除“。如果ID未被删除,则始终可以确定ID属于哪一行(从数据库中提取信息至关重要)。 然而如果id引用的行被删除,那么它 可能无法确定它属于哪一行......因为它不在那里。如果您需要,我建议您实施某种类型的审核功能,最好是triggers。
答案 1 :(得分:2)
当前自动增量值通过附加到表的额外属性在备份/恢复中保留。您可以在ENGINE =:
之后的转储中看到它mysql> create table foo ( bar int(11) primary key auto_increment );
Query OK, 0 rows affected (0.06 sec)
mysql> insert into foo () values (), (), (), ();
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> show create table foo \G
*************************** 1. row ***************************
Table: foo
Create Table: CREATE TABLE `foo` (
`bar` int(11) NOT NULL auto_increment,
PRIMARY KEY (`bar`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
您可以使用“ALTER TABLE tablename AUTO_INCREMENT =”重置它,但它看起来像我 如果属性值不超过插入时的最大现有ID,则忽略该属性值。
答案 2 :(得分:0)
另请注意,所描述的不重复使用以前使用的ID的行为对MyISAM引擎有效,但实际上对所有可用引擎无效。