【问题标题】:What MySQL statement needed to populate a field with incremental number用增量数字填充字段需要什么 MySQL 语句
【发布时间】:2012-12-24 18:03:45
【问题描述】:

我有一个旧的 MS Access 数据库,我正在将其转换为 MySQL 数据库。我使用 Bullzip 创建数据库,但由于设计不佳,旧的 MS Access 数据库对于大多数表都没有唯一的主键。

所以我创建了一个 id 字段,但显然每个条目都是空的,我想知道是否有一个简单的语句可以用 1、2、3、4 等填充它们...

编辑: 我想我没有正确地回答我的问题。我对自动增量一无所知。那不是问题。

我有一张表,里面装满了我需要保留的记录,这些记录来自一个没有将唯一 ID 定义为字段的 Access 数据库。换句话说,我有名字、姓氏等字段,但没有“id”字段。这看起来绝对是疯狂的,但显然这个数据库已经被很好地使用了,并且从来没有任何表的唯一 ID。奇怪!

无论如何,我已经在表中为 id 创建了一个字段(当然并将其设置为自动递增),但显然所有现有记录目前都没有设置 id。所以我需要为每条记录创建一个。

有没有办法使用 mysql 语句用唯一的数字填充所有这些记录?

干杯

【问题讨论】:

  • 检查我的更新解决方案并告诉我。

标签: mysql sql database ms-access


【解决方案1】:

如果您将新的 id 列添加到现有表并使其成为 AUTO_INCREMENT PRIMARY KEY,它将自动使用递增值填充它。

mysql> ALTER TABLE TheTable ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY;
mysql> SELECT id FROM TheTable;
-- outputs values 1, 2, 3, etc.

如果您创建了一个 id 列但没有将其声明为 AUTO_INCREMENT PRIMARY KEY,您可以像这样填充该列:

mysql> SET @id := 0;
mysql> UPDATE TheTable SET id = (@id := @id+1);

【讨论】:

  • 你太棒了!谢谢您的帮助!工作一种享受
【解决方案2】:

使用预定义的 AUTO_INCREMENT 字段,并在插入新记录时将值设置为 NULL,以便它自动构建适当的增量器。除此之外,没有办法(除非使用过程)来创建一组递增的值

【讨论】:

    【解决方案3】:

    使用 MySQL 的 auto_increment 特性。 MySQL 将为您的 id 列生成唯一编号。

    有关 auto_increment 功能的说明,请参阅http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

    【讨论】:

      【解决方案4】:

      如果你只想要一个唯一的标识符,你可以使用uuid() 函数。它比整数占用更多空间,但它可以满足您的需求。

      但是,我同意您应该添加自动增量列并重新填充表格的其他答案。这是保持 id 在一段时间内唯一的最简单方法,即使在发生更新时也是如此,并使用更合理的存储量。

      【讨论】:

        【解决方案5】:

        我不精通 MySQL,但我在其他 DBMS 中也遇到过同样的问题,下面是我在使用 AutoIncrement 类型工具时如何解决它,但 DBMS 无法自动追溯应用它:

        1. 重命名要添加 ID 字段的表。所以将 Table1 重命名为 Table1_Old。
        2. 创建一个新的 Table1,它是 Table1_Old 的副本,但其中没有数据。
        3. 将您的 ID/AutoIncrement 列添加到 Table1
        4. 现在将所有数据从 Table1_Old 复制到 Table1,跳过或为 ID 列指定 NULL。 (这通常是一个 INSERT..SELECT.. 命令)
        5. 删除 Table1_Old。

        实际细节和命令因 DBMS 而异,但我通常能够找到一种方法来执行这些步骤。

        【讨论】:

          【解决方案6】:

          使用AUTO_INCREMENT

          CREATE TABLE insect
              (
               id INT UNSIGNED NOT NULL AUTO_INCREMENT,
               PRIMARY KEY (id),
              name VARCHAR(30) NOT NULL,
              date DATE NOT NULL,
              origin VARCHAR(30) NOT NULL
              );
          

          更新

          我相信,除非你不会创建新表,否则这似乎是一项艰巨的任务,我会建议你使用这个

          SET @rank=0;
          SELECT @rank:=@rank+1 AS rank, itemID FROM orders;
          

          它将为您创建一个名为rank 的虚拟列,它具有唯一的 id 值。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-25
            • 2018-03-27
            • 2017-08-10
            相关资源
            最近更新 更多