【问题标题】:Trying to remove a primary key from MySQL table试图从 MySQL 表中删除主键
【发布时间】:2014-08-30 19:04:16
【问题描述】:

编辑:不知道为什么这被标记为重复。我得到的错误是不同的

我正在尝试删除主键定义,但由于某种原因收到错误。

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 ALTER TABLE aux_sponsors` DROP KEY PRIMARY;错误 1091 (42000): 不能删除 'PRIMARY';检查列/键是否存在`仍然是同样的问题。
  • 你没有主键;你有一个唯一的钥匙。所以,不需要ALTER TABLE aux_sponsors DROP PRIMARY KEY。只需执行ALTER TABLE aux_sponsors DROP KEY code。我会将此作为答案发布,但在重新打开之前我不能这样做。
  • @Ed Cottrell 在你的回答中你能解释为什么我们在 DESC 表中看到PRI 吗?这真的是误导。
  • 是的;文档中有一个原因,我会在重新打开后立即发布。

标签: mysql sql


【解决方案1】:

您没有PRIMARY KEY;你有一个UNIQUE 键。所以,你不能这样做:

ALTER TABLE `aux_sponsors` DROP PRIMARY KEY

相反,只是做

ALTER TABLE `aux_sponsors` DROP KEY `code`

DESC (a/k/a DESCRIBE) 不是真正的 MySQL 功能; according to the docs, "The DESCRIBE statement is provided for compatibility with Oracle."

More from the documentation:

如果 UNIQUE 索引不能包含 NULL 值并且表中没有 PRIMARY KEY,则它可能会显示为 PRI。如果多个列形成复合 UNIQUE 索引,则 UNIQUE 索引可能显示为 MUL;尽管列的组合是唯一的,但每列仍然可以包含给定值的多次出现。

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

【讨论】:

  • 感谢您的回答,我正在尝试在另一个关于 pkeys 的问题中找到的答案,但我没有成功,这就是为什么我创建了这个问题,因为问题不同。感谢您注意到这个问题并给了我一个信息丰富的答案!我一直在使用desc,因为我正在检查很多表格并且输入速度很快。
  • 很高兴为您提供帮助!过去我自己也遇到过这个问题。
  • 这对于 MySQL 来说似乎是一个非常糟糕的主意——因为它使您难以理解表的实际定义。
  • @LarryLustig 是的,完全正确。我对 MySQL 还是很陌生,我什至不知道有一个 SHOW INDEX,我认为只使用 describe 就是你这样做的方式。对新用户尤其不利。
猜你喜欢
  • 2011-01-07
  • 2011-11-19
  • 2012-03-03
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 2017-08-17
  • 2015-02-22
  • 2012-02-28
相关资源
最近更新 更多