【问题标题】:Alter a MySQL column to be AUTO_INCREMENT将 MySQL 列更改为 AUTO_INCREMENT
【发布时间】:2011-01-11 06:18:36
【问题描述】:

我正在尝试修改表以使其主键列 AUTO_INCREMENT 事后发生。我尝试了以下 SQL,但收到了语法错误通知。

ALTER TABLE document
ALTER COLUMN document_id AUTO_INCREMENT

是我做错了什么还是不可能?

+--------------------+ |版本() | +--------------------+ | 5.0.75-0ubuntu10.2 | +--------------------+

【问题讨论】:

    标签: sql mysql alter-table


    【解决方案1】:
    ALTER TABLE document MODIFY COLUMN document_id INT auto_increment
    

    【讨论】:

    • 我很好奇您为什么建议使用 INT(4)。有什么特别的原因吗?
    • @Steven Oxley 因为我是这样声明我的桌子的。
    • 在括号之间指定一个数字对 MySQL 整数类型完全 nothing (好吧,几乎没有)。唯一可能受数字影响的是显示宽度,这取决于客户端。但是不要被欺骗,并认为它的工作原理与 VARCHAR 和 DECIMAL 类型一样 - 在这些情况下,您可以在其中存储的数据量实际上是指定的,而 INT 的特定风格总是允许存储确切的相同的值范围
    • 我在做这个操作时总是得到一个主键错误,所以我就是这样做的:SET FOREIGN_KEY_CHECKS = 0; ALTER TABLE 文档 DROP PRIMARY KEY; ALTER TABLE document MODIFY COLUMN document_id INT PRIMARY KEY AUTO_INCREMENT NOT NULL; SET FOREIGN_KEY_CHECKS = 1;
    • 这在 MySQL 中似乎不起作用,因为您需要将列设置为主键,因为只允许一列是 auto_increment (另见Roland Bouman's answer below
    【解决方案2】:

    Roman 是对的,但请注意 auto_increment 列必须是 PRIMARY KEY 或 UNIQUE KEY 的一部分(并且在几乎 100% 的情况下,它应该是构成 PRIMARY KEY 的唯一列):

    ALTER TABLE document MODIFY document_id INT AUTO_INCREMENT PRIMARY KEY
    

    【讨论】:

    • +1。如果在创建表时未定义,则需要主键。
    • 这意味着该列中的数据必须已经是唯一的
    【解决方案3】:

    就我而言,它仅在我输入not null 时才有效。我认为这是一个约束。

    ALTER TABLE document MODIFY COLUMN document_id INT NOT NULL AUTO_INCREMENT;
    

    【讨论】:

      【解决方案4】:

      执行此操作的 SQL 是:

      ALTER TABLE `document` MODIFY COLUMN `document_id` INT AUTO_INCREMENT;
      

      您的 SQL 可能无法正常工作有几个原因。首先,您必须重新指定数据类型(在这种情况下为INT)。此外,您尝试更改的列必须被索引(它不必是主键,但通常这是您想要的)。此外,每个表只能有一个AUTO_INCREMENT 列。因此,您可能希望运行以下 SQL(如果您的列未编入索引):

      ALTER TABLE `document` MODIFY `document_id` INT AUTO_INCREMENT PRIMARY KEY;
      

      您可以在 MySQL 文档中找到更多信息:http://dev.mysql.com/doc/refman/5.1/en/alter-table.html 了解修改列语法,http://dev.mysql.com/doc/refman/5.1/en/create-table.html 了解有关指定列的更多信息。

      【讨论】:

        【解决方案5】:

        AUTO_INCREMENT 是列数据类型的一部分,您必须再次为该列定义完整的数据类型:

        ALTER TABLE document
        ALTER COLUMN document_id int AUTO_INCREMENT
        

        (以int为例,应设置为该列之前的类型)

        【讨论】:

          【解决方案6】:

          您必须在auto_increment 指令之前指定列的类型,即ALTER TABLE document MODIFY COLUMN document_id INT AUTO_INCREMENT。

          【讨论】:

          • 应该是MODIFY COLUMN
          【解决方案7】:

          您可以使用以下查询使 document_id 自动递增

          ALTER TABLE document MODIFY COLUMN document_id INT auto_increment
          

          最好也将document_id设为主键

          ALTER TABLE document MODIFY COLUMN document_id INT auto_increment PRIMARY KEY;
          

          【讨论】:

          • 请注意,如果该列已经是主键,则不能在此处再次声明它,否则它会给出有关多个主键的错误(您希望它在那里更聪明一点,并看到我猜它是同一个主键)。因此,在这种情况下,您只需跳过 PRIMARY KEY,它不会影响该列上现有的主键设置
          【解决方案8】:

          你可以这样做:

           alter table [table_name] modify column [column_name] [column_type] AUTO_INCREMENT;
          

          【讨论】:

          • 这似乎只是所有其他答案的重复。
          【解决方案9】:

          以下语句有效。请注意,您需要再次为列名提及数据类型(重新声明该列之前的数据类型)。

          ALTER TABLE document
          MODIFY COLUMN document_id int AUTO_INCREMENT;
          

          【讨论】:

            【解决方案10】:

            AUTO_INCREMENT 是列数据类型的一部分,您必须再次为该列定义完整的数据类型:

            ALTER TABLE document
            MODIFY COLUMN document_id int AUTO_INCREMENT
            

            (以int为例,应设置为该列之前的类型)

            【讨论】:

              【解决方案11】:

              如果上述方法均无效,请尝试此操作。这就是我在 MYSQL 中所做的,是的,您需要将列名 (document_id) 写入两次。

              ALTER TABLE document
              CHANGE COLUMN document_id document_id INT(11) NOT NULL AUTO_INCREMENT ;
              

              【讨论】:

                【解决方案12】:

                同时设置列为主键和auto_increment:

                  mysql> ALTER TABLE persons MODIFY COLUMN personID INT auto_increment PRIMARY KEY;
                    Query OK, 10 rows affected (0.77 sec)
                    Records: 10  Duplicates: 0  Warnings: 0
                
                    mysql>
                

                【讨论】:

                  【解决方案13】:

                  要修改 mysql 中的列,我们使用 alter 和 modify 关键字。假设我们创建了一个像这样的表:

                  create table emp(
                      id varchar(20),
                      ename varchar(20),
                      salary float
                  );
                  

                  现在我们想将列 id 的类型修改为具有自动增量的整数。您可以使用以下命令执行此操作:

                  alter table emp modify column id int(10) auto_increment;
                  

                  【讨论】:

                    【解决方案14】:

                    以前的表格语法:

                    CREATE TABLE apim_log_request (TransactionId varchar(50) DEFAULT NULL);
                    

                    要将 TransactionId 更改为自动递增,请使用此查询

                    ALTER TABLE apim_log_request MODIFY COLUMN TransactionId INT auto_increment;
                    

                    【讨论】:

                      【解决方案15】:
                      alter table tbl_user MODIFY COLUMN id int(10) auto_increment;
                      

                      【讨论】:

                        【解决方案16】:

                        就像这样:

                        alter table document modify column id int(11) auto_increment;

                        【讨论】:

                          【解决方案17】:

                          您可以通过以下查询将 atuto_increment 约束应用于数据列:

                          ALTER TABLE customers MODIFY COLUMN customer_id BIGINT NOT NULL AUTO_INCREMENT;
                          

                          但是,如果列是外键约束的一部分,您很可能会收到错误消息。因此,建议使用以下查询关闭 foreign_key_checks:

                          SET foreign_key_checks = 0;
                          

                          因此,请改用以下查询:

                          SET foreign_key_checks = 0;
                          ALTER TABLE customers MODIFY COLUMN customer_id BIGINT NOT NULL AUTO_INCREMENT;
                          SET foreign_key_checks = 1;
                          

                          【讨论】:

                            【解决方案18】:

                            当您再次重新定义列时,您必须再次指定数据类型并为其添加 auto_increment,因为它是数据类型的一部分。

                            ALTER TABLE `document` MODIFY COLUMN `document_id` INT AUTO_INCREMENT;
                            

                            【讨论】:

                              【解决方案19】:

                              尝试以下方法:

                              ALTER TABLE table_name MODIFY COLUMN id datatype auto_increment;
                              

                              【讨论】:

                                【解决方案20】:

                                由于SQL标签附加到问题上,我真的认为所有答案都错过了一个重点。

                                MODIFY 命令在 SQL server 中不存在所以运行时会报错

                                ALTER TABLE Satellites MODIFY COLUMN SatelliteID INT auto_increment PRIMARY KEY;

                                在这种情况下,您可以将新列添加为INT IDENTITY

                                ALTER TABLE Satellites
                                   ADD ID INT IDENTITY
                                       CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED;
                                

                                或


                                使用此方法用增量数字填充现有的空索引,
                                DECLARE @id INT
                                SET @id = 0 
                                UPDATE Satellites SET @id = SatelliteID = @id + 1 
                                

                                【讨论】:

                                  【解决方案21】:

                                  使用以下查询:

                                  ALTER TABLE YourTable DROP COLUMN IDCol
                                  
                                  ALTER TABLE YourTable ADD IDCol INT IDENTITY(1,1)
                                  

                                  【讨论】:

                                    猜你喜欢
                                    • 2011-01-18
                                    • 2014-04-17
                                    • 1970-01-01
                                    • 2021-12-04
                                    • 1970-01-01
                                    • 2011-10-28
                                    • 1970-01-01
                                    • 2019-01-14
                                    • 2010-12-13
                                    相关资源
                                    最近更新 更多