【问题标题】:Insert auto increment primary key to existing table将自动增量主键插入现有表
【发布时间】:2012-02-22 15:41:44
【问题描述】:

我正在尝试更改一个没有主键也没有 auto_increment 列的表。我知道如何添加主键列,但我想知道是否可以自动将数据插入主键列(我在数据库中已经有 500 行并且想给它们 id 但我不想手动执行) .有什么想法吗?非常感谢。

【问题讨论】:

  • 您可以轻松地使用alter table 来添加密钥,但 MySQL 不会为没有它们的字段生成 ID。您必须手动更新现有字段,然后确保新的 auto_increment 从正确的偏移量开始 - 它默认为“1”,无论如何您最终都会遇到重复的键错误。
  • @MarcB 我刚刚测试过,实际上它确实插入了从 1 开始的现有行的 id

标签: mysql primary-key


【解决方案1】:

添加PRIMARY KEY 列的ALTER TABLE 语句在我的测试中正常工作:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

在为测试目的而创建的临时表上,上述语句创建了 AUTO_INCREMENT id 列,并为表中的每个现有行插入了自动增量值,从 1 开始。

【讨论】:

  • 是的,这就是我的经验。永远不要记得必须运行单独的脚本来填充 auto_increment id...
  • 大声笑..谢谢。我的错。绿色标记是给你的,因为那时你的更容易实现。 :D
  • 要将其设为第一列,请使用FIRST 例如ALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
  • @Nikkie SQLite 的机制完全不同。你会在这里找到建议stackoverflow.com/questions/946011/sqlite-add-primary-key
  • @WijaySharma 如果您使用自动增量创建行并且必须立即通过 id 检索它,MySQL 为该值提供 LAST_INSERT_ID() SELECT * FROM table_name WHERE id = LAST_INSERT_ID() 并且大多数编程语言 API 提供一些函数/方法来返回应用程序代码中的那个值。
【解决方案2】:

假设您没有像 id 这样的自动增量列,没有,那么您可以使用以下查询添加:

ALTER TABLE table_name ADD id int NOT NULL AUTO_INCREMENT primary key FIRST

如果您有列,则使用以下查询更改为自动递增:

 ALTER TABLE table_name MODIFY column_name datatype(length) AUTO_INCREMENT PRIMARY KEY

【讨论】:

  • 末尾的FIRST 有什么作用?
  • 它将使新的id 列成为表中的第一个而不是最后一个,这是默认行为。
  • 工作得很好!谢谢!
【解决方案3】:

对于像我这样遇到Multiple primary key defined 错误的人,请尝试:

ALTER TABLE `myTable` ADD COLUMN `id` INT AUTO_INCREMENT UNIQUE FIRST NOT NULL;

在 MySQL v5.5.31 上,这将 id 列设置为我的主键,并用递增值填充每一行。

【讨论】:

    【解决方案4】:

    是的,这样的事情可以做到,但可能不是最好的,你可能想要做一个备份

    $get_query = mysql_query("SELECT `any_field` FROM `your_table`");
    
    $auto_increment_id = 1;
    
    while($row = mysql_fetch_assoc($get_query))
    {
      $update_query = mysql_query("UPDATE `your_table` SET `auto_increment_id`=$auto_increment_id WHERE `any_field` = '".$row['any_field']."'");
      $auto_increment_id++;
    }
    

    请注意,更新时您选择的any_field必须相同。

    【讨论】:

      【解决方案5】:

      我找到的最简单最快的就是这个

      ALTER TABLE mydb.mytable 
      ADD COLUMN mycolumnname INT NOT NULL AUTO_INCREMENT AFTER updated,
      ADD UNIQUE INDEX mycolumnname_UNIQUE (mycolumname ASC);
      

      【讨论】:

        【解决方案6】:

        我能够调整这些指令,获取具有现有非递增主键的表,并向表中添加递增主键,并使用旧主键和旧主键创建新的复合主键使用以下代码作为复合主键的新键:

        DROP TABLE  IF EXISTS SAKAI_USER_ID_MAP;
        
        CREATE TABLE SAKAI_USER_ID_MAP (
               USER_ID             VARCHAR (99) NOT NULL,
               EID                 VARCHAR (255) NOT NULL,
               PRIMARY KEY (USER_ID)
        );
        
        INSERT INTO SAKAI_USER_ID_MAP VALUES ('admin', 'admin');
        INSERT INTO SAKAI_USER_ID_MAP VALUES ('postmaster', 'postmaster');
        
        ALTER TABLE  SAKAI_USER_ID_MAP 
          DROP PRIMARY KEY, 
          ADD _USER_ID INT AUTO_INCREMENT NOT NULL FIRST, 
          ADD PRIMARY KEY ( _USER_ID, USER_ID );
        

        完成此操作后,_USER_ID 字段将存在,并且主键的所有数字值与您期望的完全一样。使用顶部的“DROP TABLE”,您可以反复运行它来试验变化。

        我无法开始工作的是传入的 FOREIGN KEY 已经指向 USER_ID 字段的情况。当我尝试使用来自另一个表的传入外键执行更复杂的示例时收到此消息。

        #1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150)
        

        我猜我需要在执行 ALTER 表之前拆除所有外键,然后再重建它们。但现在我想将这个解决方案分享给原始问题的更具挑战性的版本,以防其他人遇到这种情况。

        【讨论】:

          【解决方案7】:

          为了使现有的主键为auto_increment,您可以使用:

          ALTER TABLE table_name MODIFY id INT AUTO_INCREMENT;
          

          【讨论】:

          • 为了避免多主键定义错误,应该使用这种方法
          【解决方案8】:

          导出您的表,然后清空您的表,然后将字段添加为唯一 INT,然后将其更改为 AUTO_INCREMENT,然后再次导入您之前导出的表。

          【讨论】:

            【解决方案9】:

            您可以使用以下命令向现有表中添加一个新的主键列,该表可以有序列号:

            ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 
            

            【讨论】:

            • ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTITY' at line 1
            【解决方案10】:

            我遇到了同样的问题,所以我删除了主键的字段,然后我重新创建了它并确保它是自动增量的。这对我有用。我希望它可以帮助其他人

            【讨论】:

              【解决方案11】:

              ALTER TABLE tableName MODIFY tableNameID MEDIUMINT NOT NULL AUTO_INCREMENT;

              这里 tableName 是您的表的名称,

              tableName 是您的主要列名,必须修改

              MEDIUMINT 是您现有主键的数据类型

              AUTO_INCREMENT你必须在不为空之后添加 auto_increment

              它会使那个主键auto_increment......

              希望这有帮助:)

              【讨论】:

              • 如果你 edit 并添加一些解释会很有用。
              【解决方案12】:

              嗯,您有多种方法可以做到这一点: - 如果您的表中没有任何数据,只需将其删除并重新创建即可。

              删除现有字段并像这样重新创建它

              ALTER TABLE test DROP PRIMARY KEY, DROP test_id, ADD test_id int AUTO_INCREMENT NOT NULL FIRST, ADD PRIMARY KEY (test_id);
              

              或者只是修改它

              ALTER TABLE test MODIFY test_id INT AUTO_INCREMENT NOT NULL, ADD PRIMARY KEY (test_id);
              

              【讨论】:

                【解决方案13】:

                如何编写 PHP 来更改已经存在的字段(在本例中为名称)以使其成为主键? W/o,当然,向表中添加任何额外的 'id' 字段..

                这是当前创建的表 - 找到的记录数:4 name VARCHAR(20) YES 品种 VARCHAR(30) 是 颜色 VARCHAR(20) 是 重量 SMALLINT(7) 是

                这是寻求的最终结果(表格描述)-

                找到的记录数:4 名称 VARCHAR(20) 无优先级 品种 VARCHAR(30) 是 颜色 VARCHAR(20) 是 重量 SMALLINT(7) 是

                而不是得到这个 -

                找到的记录数:5 id int(11) 无优先级 名称 VARCHAR(20) 是 品种 VARCHAR(30) 是 颜色 VARCHAR(20) 是 重量 SMALLINT(7) 是

                尝试之后..

                $query = "ALTER TABLE racehorses ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id)";

                如何获得这个? -

                找到的记录数:4 名称 VARCHAR(20) 无优先级 品种 VARCHAR(30) 是 颜色 VARCHAR(20) 是 重量 SMALLINT(7) 是

                即INSERT/ADD.. 等主键 INTO 第一个字段记录(没有添加额外的 'id' 字段,如前所述。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2018-03-21
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-12-15
                  • 2011-06-19
                  相关资源
                  最近更新 更多