在MySQL中删除主键


181

我有以下表模式,它将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

如何删除列的主键?

Answers:


285

如果没有索引,则维护自动增量列会变得太昂贵,这就是为什么MySQL要求自动增量列成为索引的最左侧部分的原因。

您应该在删除键之前删除autoincrement属性:

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); 更改表user_customer_permission更改id id int(11)auto_increment;
markb 2010年

@markb:如果您还原了主键,则可以确定将其恢复为AUTO_INCREMENT
Quassnoi 2010年

这意味着自动增量列将成为PRIMARY KEY最左侧的部分。
奥雅纳(Arup Rakshit)2013年

1
@ArupRakshit:dev.mysql.com/doc/refman/5.6/en/... 要使用AUTO_INCREMENT与一个InnoDB表机构,AUTO_INCREMENTai_col必须被定义为索引的一部分,使得其能够执行等效的索引的SELECT MAX(ai_col)查找在表上获取最大列值。通常,这是通过使该列成为某个表索引的第一列来实现的。
Quassnoi

它说未定义PRIMARY。为什么会这样?所以,我不得不删除并没有指定一个主键重新添加ID列
mrbengi

121

一条线:

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

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


5
我认为这个答案需要浮出水面,因为它不仅消除了更改字段定义的需要,而且还允许通过更改表上的fk约束来进行更改-确实帮助了我!
tomfumb

太好了!对我来说,删除主键是行不通的,即使我更改了该字段以摆脱自动增量。但是这个解决方案很好!
user2447161

14

我相信Quassnoi已经回答了您的直接问题。附带说明:也许这只是您措辞上的尴尬,但您似乎感觉到您拥有三个主键,每个字段一个。不是这种情况。根据定义,您只能有一个主键。您在这里拥有的是一个主键,它是三个字段的组合。因此,您不能“将主键放在列上”。您可以删除主键,也可以不删除主键。如果要一个仅包含一列的主键,则可以将现有的主键放在3列上,并在1列上创建一个新的主键。




5

“如果您还原了主键,您肯定可以将其还原为AUTO_INCREMENT”

毫无疑问,是否需要ID列的“恢复PK属性”和“恢复自动增量属性”。

鉴于它在表的先前定义中是自动递增的,因此很可能存在某些程序在不提供ID值的情况下插入到该表中(因为ID列始终是自动递增的)。

任何此类程序的操作都将因不还原autoincrement属性而中断。


3

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

接下来,放下主键。修改表user_customer_permission删除主键;



1

我有同样的问题,并且表中还有一些值。虽然我用

ALTER TABLEuser_customer_permission DROP PRIMARY KEY , ADD PRIMARY KEY (ID)

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


1

添加列主键。

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

删除从表的主键。

ALTER TABLE table_name DROP PRIMARY KEY;

0

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


0

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


尽管此帖子可以解决问题,但包括屏幕截图确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您正在使用的用户界面。
海盗X
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.