【问题标题】:How to add auto increment primary key based on an order of column?如何根据列的顺序添加自增主键?
【发布时间】:2011-12-01 10:47:11
【问题描述】:

我需要向已经存在的表添加一个自动增量 ID。我做到了:

ALTER TABLE table_name ADD column_name INT NOT NULL AUTO_INCREMENT FIRST ,
ADD PRIMARY KEY (column_name)

但是,自动编号不是基于任何特定的列顺序。我希望 mysql 根据特定列的顺序巧妙地放置自动编号。有可能吗?

那里的大多数答案都告诉您如何添加自动增量字段,而不是如何控制现有表中的这些数字。

【问题讨论】:

    标签: mysql auto-increment


    【解决方案1】:

    请注意,MySQL 表只能有一列具有AUTO_INCREMENT 属性。

    假设表没有主键

    ALTER TABLE table_name ADD COLUMN new_id INT NOT NULL;
    SET @x = 0;
    UPDATE table_name SET new_id = (@x:=@x+1) ORDER BY whateveryouwant ASC;
    ALTER TABLE table_name ADD PRIMARY KEY new_id (new_id);
    ALTER TABLE table_name CHANGE new_id new_id INT NOT NULL AUTO_INCREMENT;
    

    假设表已经有一个非递增的主键

    只需在第四个命令中省略 PRIMARY 关键字即可。

    【讨论】:

    • 你可以有一个不是主键的自动递增列,只要它上面有一个索引(键)。您可以使用此代码将索引添加到列 ALTER TABLE table_name ADD INDEX new_id (new_id);
    • 像冠军一样工作!投票赞成。不幸的是,它需要大约 2.5 倍于仅添加 auto_increment 而不指定顺序,因此我们无法使用它,因为它不是绝对必要的,并且会使我们的系统停机时间太长。尽管如此,还是喜欢这个解决方案!
    【解决方案2】:
    1. 添加一个新字段 - ALTER TABLE table_name ADD column_name INT FIRTS;
    2. 在新字段中填充数据。
    3. 将此字段作为主键的一部分并添加 AUTO_INCREMENT 选项 -

      ALTER TABLE 表名 更改列 id id INT(11) NOT NULL AUTO_INCREMENT, 添加主键(id);

    编辑:

    试试这个计划:

    1. 创建另一个表,同table_name
    2. 用来自table_name 表的排序数据填充新表:

      INSERT INTO temp_table_name SELECT * FROM table_name ORDER BY name;

    3. table_name 表:

      TRUNCATE TABLE 表名;

    4. 更改 table_name 表,添加新的自动增量字段并使其成为主要字段(您的代码)。

    5. 从 temp 复制数据。表到table_name

      INSERT INTO table_name SELECT NULL, t.* FROM temp_table_name t;

    【讨论】:

    • 感谢您的回答。在第 2 步中,我不想手动填充该字段。而是让它们根据 column_name 的排序顺序自动填充
    • 我又添加了一个解决方案。
    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 2014-02-10
    • 2018-06-05
    • 2021-10-02
    • 2011-01-25
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多