Mysql 强制添加具有旧删除行的未使用自动增量ID的新行

Mysql 强制添加具有旧删除行的未使用自动增量ID的新行,mysql,sql,Mysql,Sql,让我们举个例子: id (auto_increment) user 1 John 2 Mary 10 Christopher 如何强制查询添加未使用ID的新用户在我们从3到9的例子中:您可以使用一点巧妙的SQL将要插入的记录的ID设置为表的第一个“缺失”ID值: INSERT INTO myTable (id, user) VALUES ( (SELECT MIN

让我们举个例子:

id (auto_increment)   user
1                     John
2                     Mary
10                    Christopher

如何强制查询添加未使用
ID的新
用户
在我们从3到9的例子中:

您可以使用一点巧妙的SQL将要插入的记录的ID设置为表的第一个“缺失”ID值:

INSERT INTO myTable (id, user) 
VALUES 
(
   (SELECT MIN(mt2.id)+1 from myTable mt2 WHERE NOT EXISTS 
         (SELECT 'Y' from myTable mt3 where mt3.Id = mt2.id + 1)), 
   'New User Name'
)
根据DBMS的不同,您可能无法在一个查询中完成此操作。这种方法也使得Id列成为“自动生成”列变得毫无用处;此插入将始终找到没有ID的最小值,无论该ID是否是identity generator尝试使用的ID,并且在插入到表之前,您几乎总是必须启用“identity insert”,因此此表上的自动生成功能将永远不会被使用。

这是怎么回事:

/*!40000 ALTER TABLE `mytable` DISABLE KEYS */;
INSERT INTO `mytable` (`id`,`col1`) VALUES (1,'mydata');
/*!40000 ALTER TABLE `mytable` ENABLE KEYS */;

更简单。由MySQL Admin GUI工具生成。

为什么要这样做?这可能不是你想象的好主意,可能会导致比解决问题更多的问题。你想要这个有什么原因吗?如果所有主键值都是连续的,那又有什么关系呢?如果OP希望创建和删除大量用户,那么可以想象他最终可能会“用完”32位整数标识列的新标识值,并且他可能不想使用64位值。“压缩”现有ID的批处理过程成本高昂且容易出错。然而,这两个问题都是边缘问题;在他接近出现问题之前,必须创建20亿个用户。运行此查询的缺点是NlogN时间复杂性(第一个子查询扫描表中索引子查询不返回行的所有元素),事实上,它可能不适用于某些在insert语句中不接受子查询表达式的DBMS。ANSI标准不需要它(尽管大多数商业DBMS都允许),我只在晚上运行这个查询,这样白天就不会占用服务器的很多资源。