3

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

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

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

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

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

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

干杯

4

6 回答 6

8

如果您将新的 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);
于 2012-12-24T18:47:56.783 回答
2

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

于 2012-12-24T18:05:07.293 回答
0

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

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

于 2012-12-24T18:07:32.787 回答
0

采用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 值的名称的虚拟列。

于 2012-12-24T18:09:25.503 回答
0

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

但是,我同意其他答案,即您应该添加一个自动增量列并重新填充表。这是随着时间的推移保持 id 唯一性的最简单方法,即使发生更新,并且使用更合理的存储量。

于 2012-12-24T18:33:22.357 回答
0

我不精通 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 而异,但我通常能够找到一种方法来执行这些步骤。

于 2012-12-24T18:45:18.150 回答