尝试从MySQL表中移除主键

7

编辑:不确定为什么这被标记为重复。我收到的错误信息是不同的。

我正在尝试删除一个主键定义,但出现了某些错误。

mysql> ALTER TABLE `aux_sponsors` DROP PRIMARY KEY;
ERROR 1091 (42000): Can't DROP 'PRIMARY'; check that column/key exists
mysql> desc aux_sponsors;
+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| unit        | varchar(8)   | NO   |     | MF      |       |
| code        | varchar(32)  | NO   | PRI | NULL    |       |
| userid      | varchar(32)  | NO   |     |         |       |
| fullName    | varchar(64)  | NO   |     |         |       |
| department  | varchar(255) | NO   |     |         |       |
| description | varchar(255) | NO   |     | NULL    |       |
+-------------+--------------+------+-----+---------+-------+
6 rows in set (0.01 sec)

我这里有问题吗?我只是想在这张表中取消主键。

mysql> SHOW CREATE TABLE aux_sponsors;
+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table        | Create Table                                                                                                                                                                                                                                                                                                                                                |
+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| aux_sponsors | CREATE TABLE `aux_sponsors` (
  `unit` varchar(8) NOT NULL DEFAULT 'MF',
  `code` varchar(32) NOT NULL,
  `userid` varchar(32) NOT NULL DEFAULT '',
  `fullName` varchar(64) NOT NULL DEFAULT '',
  `department` varchar(255) NOT NULL DEFAULT '',
  `description` varchar(255) NOT NULL,
  UNIQUE KEY `code` (`code`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

你能试一下 ALTER TABLE \aux_sponsors` DROP KEY 'PRIMARY';` 吗? - ForguesR
@ForguesR ALTER TABLE aux_sponsorsDROP KEYPRIMARY; 错误 1091 (42000):无法删除“PRIMARY”;请检查列/键是否存在。 问题仍然存在。 - ComputerLocus
你没有主键,只有唯一键。因此,不需要执行 ALTER TABLE aux_sponsors DROP PRIMARY KEY。只需执行 ALTER TABLE aux_sponsors DROP KEY code 即可。我会将此作为答案发布,但在此问题重新开放之前我无法这样做。 - elixenide
@Ed Cottrell,您能否在您的回答中解释一下为什么我们在表DESC中看到PRI?这真的很误导人。 - ForguesR
是的,文档中有原因,一旦重新开放,我会尽快发布。 - elixenide
1个回答

7
你没有主键,但有唯一键。因此,你不能这样做:
ALTER TABLE `aux_sponsors` DROP PRIMARY KEY

相反,只需执行

ALTER TABLE `aux_sponsors` DROP KEY `code`

DESC(也称为DESCRIBE)不是真正的MySQL功能; 根据文档,“DESCRIBE语句是为了与Oracle兼容而提供的。”

文档中更多内容:

如果一个唯一索引不能包含NULL值并且表中没有主键,那么它可以显示为PRI。如果几列组成了复合唯一索引,则该唯一索引可以显示为MUL;虽然这些列的组合是唯一的,但每列仍然可以包含多个给定值的实例。

在您的情况下,列codeNOT NULL且是UNIQUE键中唯一的列,因此DESC将其显示为PRI。由于这种类型的问题,最好使用SHOW INDEX来查找表中键的类型。

谢谢你的回答,我尝试了在另一个关于pkeys的问题中找到的答案,但是没有成功,这就是为什么我创建了这个问题,因为问题不同。感谢您注意到这个问题并给我提供了一个很好的信息性答案!我一直在使用desc,因为我正在检查很多表格,而且打字速度很快。 - ComputerLocus
1
很高兴能帮忙!我过去也遇到过这个问题。 - elixenide
2
这似乎是MySQL方面的一个非常糟糕的想法,因为它使得理解您的表的实际定义变得困难。 - Larry Lustig
1
@LarryLustig 是的,完全正确。我对MySQL还比较新,甚至不知道有SHOW INDEX这个命令,一直以为使用describe就可以了。对于新用户来说并不是很友好。 - ComputerLocus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接