208

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

如何删除列的主键?

4

12 回答 12

333

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

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

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

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

如果它恰好是唯一的,你可以让它成为一个PRIMARY KEY又一个AUTO_INCREMENT

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;
于 2010-01-21T17:23:31.390 回答
132

一条线:

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

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

于 2010-01-21T17:51:40.670 回答
17

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

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

不是这种情况。根据定义,您只能拥有一个主键。您在这里拥有的是一个由三个字段组合而成的主键。

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

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

于 2010-01-21T17:45:48.467 回答
12
ALTER TABLE `user_customer_permission` MODIFY `id` INT;
ALTER TABLE `user_customer_permission` DROP PRIMARY KEY;
于 2010-01-21T17:25:30.107 回答
8

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

于 2015-11-20T08:58:42.080 回答
5

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

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

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

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

于 2010-01-21T18:30:45.390 回答
3

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

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

于 2014-09-04T05:57:22.240 回答
2

我有同样的问题,除了我的表中的一些值。虽然我改变了我的主键

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

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

于 2017-07-22T12:01:09.013 回答
2

在列中添加主键。

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

从表中删除主键。

ALTER TABLE table_name DROP PRIMARY KEY;
于 2018-05-08T05:45:14.830 回答
0
ALTER TABLE `table_name` ADD PRIMARY KEY( `column_name`);
于 2019-10-24T03:27:48.357 回答
0

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

于 2016-08-14T20:53:17.223 回答
-1

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

于 2018-04-09T13:49:05.633 回答