我有以下表架构,它将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
如何删除列的主键?
11 回答
首先修改列以删除auto_increment字段,如下所示:alter table user_customer_permission modify column id int;
接下来,删除主键 . alter table user_customer_permission drop primary key;
如果没有索引,维护自动增量列会变得太昂贵,这就是
MySQL
要求自动增量列成为索引最左边的部分的原因 .您应该在删除密钥之前删除autoincrement属性:
请注意,您有一个复合
PRIMARY KEY
,它涵盖了所有三列,id
不保证是唯一的 .如果它恰好是唯一的,你可以再次使它成为
PRIMARY KEY
和AUTO_INCREMENT
:我有同样的问题,并在我的表内的一些值旁边 . 虽然我改变了我的主键
ALTER TABLE
user_customer_permissionDROP PRIMARY KEY , ADD PRIMARY KEY (
id)
问题在我的服务器上继我在表格中创建了新字段,我将值转换为新字段并删除旧字段,问题解决了!
如果您有复合主键,请执行以下操作 -
ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);
“如果你恢复主键,你肯定可以将它恢复为AUTO_INCREMENT”
应该不存在是否需要“恢复PK属性”和“恢复ID列的自动增量属性” .
鉴于它在表的先前定义中是自动增量,很可能存在一些程序插入到该表中而不提供ID值(因为ID列无论如何都是自动增量) .
任何此类程序的操作都将因不恢复自动增量属性而中断 .
在SQL管理器中找到该表,右键单击它并选择设计,然后右键单击小键图标并选择删除主键 .
到 add 列中的主键 .
从表中 remove 主键 .
首先备份数据库 . 然后删除与表关联的任何外键 . 截断外键表 . 触发当前表 . 删除所需的主键 . 使用sqlyog或workbench或heidisql或dbeaver或phpmyadmin .
我相信Quassnoi已经回答了你的直接问题 . 只是旁注:也许这只是你的一些尴尬的措辞,但你似乎认为你有三个主键,每个字段一个 . 不是这种情况 . 根据定义,您只能拥有一个主键 . 你在这里有一个主键,它是三个字段的组合 . 因此,您不能“将主键放在列上” . 您可以删除主键,也可以不删除主键 . 如果希望主键仅包含一列,则可以将现有主键放在3列上,并在1列上创建新主键 .
一条线:
你也不会失去自动增量,必须重新添加它可能有副作用 .