删除MySQL中的主键

mar*_*rkb 171 mysql sql database-design primary-key mysql-error-1075

我有以下表架构,它将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)
Run Code Online (Sandbox Code Playgroud)

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

当我运行命令时:

alter table user_customer_permission drop primary key;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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

如何删除列的主键?

Qua*_*noi 273

如果没有索引,维护自动增量列会变得过于昂贵,这就是为什么MySQL需要将自动增量列作为索引的最左边部分.

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

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL;
ALTER TABLE user_customer_permission DROP PRIMARY KEY;
Run Code Online (Sandbox Code Playgroud)

请注意,您有一个PRIMARY KEY覆盖所有三列的复合,id并不保证是唯一的.

如果碰巧是唯一的,你可以把它是一个PRIMARY KEYAUTO_INCREMENT再次:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;
Run Code Online (Sandbox Code Playgroud)

  • *自动增量列成为主键最左边的部分是什么意思。*? (2认同)

mlu*_*bke 116

一条线:

ALTER TABLE  `user_customer_permission` DROP PRIMARY KEY , ADD PRIMARY KEY (  `id` )
Run Code Online (Sandbox Code Playgroud)

你也不会失去自动增量,必须重新添加它可能有副作用.

  • 我认为这个答案需要浮动到顶部,因为它不仅消除了更改字段定义的需要,还允许通过对表格上的fk约束进行更改 - 真的帮助了我! (5认同)

Jay*_*Jay 14

我相信Quassnoi已经回答了你的直接问题.只是旁注:也许这只是你的一些尴尬措辞,但你似乎认为你有三个主键,每个字段一个.不是这种情况.根据定义,您只能拥有一个主键.你在这里有一个主键,它是三个字段的组合.因此,您不能"将主键放在列上".您可以删除主键,也可以不删除主键.如果希望主键仅包含一列,则可以将现有主键放在3列上,并在1列上创建新主键.


Ali*_*xel 10

ALTER TABLE `user_customer_permission` MODIFY `id` INT;
ALTER TABLE `user_customer_permission` DROP PRIMARY KEY;
Run Code Online (Sandbox Code Playgroud)


sum*_*yar 9

在列中添加主键

ALTER TABLE table_name ADD PRIMARY KEY (column_name);
Run Code Online (Sandbox Code Playgroud)

从表中删除主键

ALTER TABLE table_name DROP PRIMARY KEY;
Run Code Online (Sandbox Code Playgroud)


Vis*_*oot 6

如果您有复合主键,请执行以下操作 - ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);


Erw*_*out 5

"如果你恢复主键,你肯定可以将它恢复为AUTO_INCREMENT"

应该不存在是否需要"恢复PK属性"和"恢复ID列的自动增量属性".

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

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