Mysql 删除自动增量中的间隙

Mysql 删除自动增量中的间隙,mysql,Mysql,假设我有一个具有自动递增id字段的MySQL表,然后插入3行。然后,我删除第二行。现在表的id为1,3。我能让MySQL纠正这一点并将其设置为1,2而不必编写程序吗?MySQL不会让您在自动索引列创建后更改其索引。我所做的是删除自动索引列,然后添加一个同名的新列,mysql将为新生成的列编制索引,没有任何间隙。仅在自动索引与其余数据无关但仅用作更新和删除参考的表上执行此操作 例如,我最近做了一个包含谚语的表格,其中自动索引列仅在我更新或删除谚语时使用,但我需要自动索引是连续的,因为谚语是通过介于

假设我有一个具有自动递增id字段的MySQL表,然后插入3行。然后,我删除第二行。现在表的id为1,3。我能让MySQL纠正这一点并将其设置为1,2而不必编写程序吗?

MySQL不会让您在自动索引列创建后更改其索引。我所做的是删除自动索引列,然后添加一个同名的新列,mysql将为新生成的列编制索引,没有任何间隙。仅在自动索引与其余数据无关但仅用作更新和删除参考的表上执行此操作

例如,我最近做了一个包含谚语的表格,其中自动索引列仅在我更新或删除谚语时使用,但我需要自动索引是连续的,因为谚语是通过介于1和谚语计数之间的随机数提取的,序列中存在间隙可能会导致指向不存在索引的随机数

HTH

引用(并且可以扩展到其他RDBMS):“如果该字段对用户有意义,则不应使用自动编号(或自动增量)。”

我能想到的唯一选择(仅使用MySQL)是:

  • 创建一个触发器,将行号添加到列(而不是主键)
  • 创建一个过程来删除行并更新行号(很抱歉,我无法使用触发器执行此操作)
  • 示例:

    create table tbl_dummy(
        id int unsigned not null auto_increment primary key,
        row_number int unsigned not null default 0,
        some_value varchar(100)
    );
    
    delimiter $$
    -- This trigger will add the correct row number for each record inserted 
    -- to the table, regardless of the value of the primary key    
    create trigger add_row_number before insert on tbl_dummy
    for each row
    begin
        declare n int unsigned default 0;
        set n = (select count(*) from tbl_dummy);
        set NEW.row_number = n+1;
    end $$
    
    -- This procedure will update the row numbers for the records stored
    -- after the id of the soon-to-be-deleted record, and then deletes it.
    create procedure delete_row_from_dummy(row_id int unsigned)
    begin
        if (select exists (select * from tbl_dummy where id = row_id)) then
            update tbl_dummy set row_number = row_number - 1 where id > row_id;
            delete from tbl_dummy where id = row_id;
        end if;
    end $$
    
    delimiter ;
    请注意,将强制您逐个删除记录,并强制您获取要删除的记录的正确主键值


    希望这有帮助

    这不是主键的意图。如果你需要序列号,不要看主键。你想实现什么?…(从Ian Wood继续)如果您想要顺序编号而不是PK,请使用
    rowid
    。我正在尝试将行id从1,2,4,5,7,8等更改为1,2,3,4,5,6等。为什么需要对id进行重新排序?有什么问题吗?重复的,但我在其他表中有一些与自动递增id相关的数据作为外键,,,那么我将如何执行此操作?它将最好是将非PK字段作为顺序RNG友好索引,完全忽略自动递增的PK。正如其他人所说,自动递增并不意味着保证顺序,也不意味着用于任何二次使用。@ReNiShAR,在不太可能的情况下,六年后您仍然需要答案,请参阅。