【问题标题】:Remove Primary Key in MySQL删除 MySQL 中的主键
【发布时间】:2011-01-07 20:26:32
【问题描述】:

我有以下表架构,它将 user_customers 映射到实时 MySQL 数据库的权限:

mysql> describe user_customer_permission;
+------------------+---------+------+-----+---------+----------------+
| Field            | Type    | Null | Key | Default | Extra          |
+------------------+---------+------+-----+---------+----------------+
| id               | int(11) | NO   | PRI | NULL    | auto_increment |
| user_customer_id | int(11) | NO   | PRI | NULL    |                |
| permission_id    | int(11) | NO   | PRI | NULL    |                |
+------------------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

我想删除 user_customer_id 和 permission_id 的主键,并保留 id 的主键。

当我运行命令时:

alter table user_customer_permission drop primary key;

我收到以下错误:

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

如何删除列的主键?

【问题讨论】:

    标签: mysql sql database-design primary-key mysql-error-1075


    【解决方案1】:

    我相信@Quassnoi 已经回答了您的直接问题。

    只是一个旁注,也许这只是你的一些尴尬措辞,但你似乎认为你有三个主键,每个字段一个。

    事实并非如此。根据定义,您只能拥有一个主键。您在这里拥有的是一个由三个字段组合而成的主键。

    因此,您不能“删除列上的主键”,您可以删除主键,或者不删除主键。

    如果您想要一个只包含一列的主键,您可以删除 3 列上的现有主键并在 1 列上创建一个新的主键。

    【讨论】:

      【解决方案2】:
      ALTER TABLE `table_name` ADD PRIMARY KEY( `column_name`);
      

      【讨论】:

        【解决方案3】:

        在列中添加主键。

        ALTER TABLE table_name ADD PRIMARY KEY (column_name);
        

        从表中删除主键。

        ALTER TABLE table_name DROP PRIMARY KEY;
        

        【讨论】:

          【解决方案4】:

          在 SQL 管理器中找到表,右键单击它并选择设计,然后右键单击小键图标并选择删除主键。

          【讨论】:

          • 虽然这篇文章可能会解决问题,但包括截图确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您正在查看的 UI。
          【解决方案5】:

          我有同样的问题,除了我的表中的一些值。虽然我用

          更改了我的主键

          ALTER TABLEuser_customer_permissionDROP PRIMARY KEY , ADD PRIMARY KEY (id)

          问题在我的服务器上继续存在。我在表中创建了新字段,将值转移到新字段中并删除了旧字段,问题解决了!!

          【讨论】:

            【解决方案6】:

            首先备份数据库。然后删除与表关联的任何外键。截断外键表。截断当前表。删除所需的主键。使用 sqlyog 或 workbench 或 heidisql 或 dbeaver 或 phpmyadmin。

            【讨论】:

              【解决方案7】:

              如果您有复合主键,请这样做-ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);

              【讨论】:

                【解决方案8】:

                首先修改列以删除 auto_increment 字段,如下所示: alter table user_customer_permission modify column id int;

                接下来,删除主键。 alter table user_customer_permission 删除主键;

                【讨论】:

                  【解决方案9】:

                  如果没有索引,维护自动增量列变得过于昂贵,这就是MySQL 要求将自动增量列作为索引的最左侧部分的原因。

                  您应该在删除密钥之前删除自动增量属性:

                  ALTER TABLE user_customer_permission MODIFY id INT NOT NULL;
                  ALTER TABLE user_customer_permission DROP PRIMARY KEY;
                  

                  请注意,您有一个复合 PRIMARY KEY,它涵盖了所有三列,并且 id 不能保证是唯一的。

                  如果它恰好是唯一的,您可以再次将其设为PRIMARY KEYAUTO_INCREMENT

                  ALTER TABLE user_customer_permission MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;
                  

                  【讨论】:

                  • 难道我不需要将 id 列恢复为 auto_increment 主键吗?更改表 user_customer_permission 添加主键(id); alter table user_customer_permission change id id int(11) auto_increment;
                  • @markb:如果您恢复主键,您肯定可以将其恢复为AUTO_INCREMENT
                  • 这是什么意思 autoincrement 列成为 PRIMARY KEY 的最左边部分。 ?
                  • @ArupRakshit: dev.mysql.com/doc/refman/5.6/en/… 要将 AUTO_INCREMENT 机制与 InnoDB 表一起使用,必须将 AUTO_INCREMENTai_col 定义为索引的一部分,以便可以对表执行等效的索引SELECT MAX(ai_col) 查找以获得最大列值。通常,这是通过使列成为某个表索引的第一列来实现的。
                  • 它说 PRIMARY 没有定义。为什么会出现这种情况?所以我不得不删除并再次添加 ID 列而不指定主键
                  【解决方案10】:

                  "如果您恢复主键,您肯定可以将其恢复为 AUTO_INCREMENT"

                  ID列是否需要“恢复PK属性”和“恢复自增属性”应该没有问题。

                  鉴于它在表的先前定义中是自动增量的,很可能存在一些程序在不提供 ID 值的情况下插入到此表中(因为无论如何 ID 列都是自动增量的)。

                  任何此类程序的操作都会因不恢复自动增量属性而中断。

                  【讨论】:

                    【解决方案11】:

                    一行:

                    ALTER TABLE  `user_customer_permission` DROP PRIMARY KEY , ADD PRIMARY KEY (  `id` )
                    

                    您也不会丢失自动增量,并且必须重新添加它,这可能会产生副作用。

                    【讨论】:

                    • 我认为这个答案需要浮到顶部,因为它不仅消除了更改字段定义的需要,还允许通过更改表上的 fk 约束进行更改 - 真的帮助了我出去!
                    • 完美!对我来说,删除主键不起作用,即使我改变了字段以摆脱自动增量。但是这个解决方案很好用!
                    【解决方案12】:
                    ALTER TABLE `user_customer_permission` MODIFY `id` INT;
                    ALTER TABLE `user_customer_permission` DROP PRIMARY KEY;
                    

                    【讨论】:

                      猜你喜欢
                      • 2011-11-19
                      • 2012-03-03
                      • 1970-01-01
                      • 1970-01-01
                      • 2014-08-30
                      • 2015-04-05
                      • 2017-03-10
                      • 2011-03-06
                      • 2011-01-18
                      相关资源
                      最近更新 更多