如何重新编号主索引

时间:2010-04-15 07:24:40

标签: sql mysql

我有一个简单的MySQL表,主索引(id)没有逐个编号(1,31,35,100等)。我想让它们编号为(1,2,3,4)。请告诉我怎么做。我还想指出,我知道手术的可能后果,但我只是想整理一下。

6 个答案:

答案 0 :(得分:42)

我同意其他方法可行,但我只是提出了不同的想法。这将没有任何临时表创建要求::

SET @i=0;
UPDATE table_name SET column_name=(@i:=@i+1);

答案 1 :(得分:15)

尝试重新编号dalmp(DALMP Database Abstraction Layer for MySQL using PHP.

的方法
$db->renumber('table','uid');

基本上它是这样做的:

SET @var_name = 0;
UPDATE Tablename SET ID = (@var_name := @var_name +1);
ALTER TABLE tablename AUTO_INCREMENT = 1

答案 2 :(得分:4)

最简单的解决方案是:

  • 将表重命名为tablename_temp
  • 使用旧名称和相同结构创建一个新表
  • INSERT INTO tablename(id,field1,field2,field3)SELECT NULL,field1,field2,field3,... FROM tablename_temp;
  • DROP tablename_temp

如果您使用外键,这将破坏您的所有数据,我强烈建议您保留原有的ID。数据库不是不整洁,因为主键不是顺序的,如果数据库的参照完整性(指向其他表中错误或不存在的行的id值)被破坏,则数据库是不整洁的。

答案 3 :(得分:2)

CREATE TABLE newtable 
  LIKE oldtable 
  SELECT NULL, col1, col2, col3, etc FROM oldtable;

不包括select中的主键列,而是包括所有其他列。

主键列应该在表格的第一列,或者您需要将NULL设置为主键列的位置。该列应具有“NOT NULL”设置。否则它将被设置为null,这是毫无意义的。

这样做的原因是因为MySQL喜欢忽略auto_increments上的NULL插入,而是为它创建一个新数字(假设null不是该列上的有效值)。

答案 4 :(得分:2)

  1. 删除“id”列。
  2. 使用自动增量创建名为id的列(并且不允许空值),它将具有您想要的新值。
  3. 将此新“id”列指定为PK。
  4. 后来感谢评论。

答案 5 :(得分:0)

您必须在主键上定义自动增量(如果它是主键)

这是一个链接:

sql autoincrement