【问题标题】:Can't drop either add primary key不能删除添加主键
【发布时间】:2017-04-14 11:10:10
【问题描述】:

我有这张桌子:

CREATE TABLE `event_schedule_tag` (                                                                                                   
  `event_schedule_id` bigint(20) NOT NULL,                                                                                                                   
  `tag_id` bigint(20) NOT NULL,                                                                                                                              
  KEY `event_schedule_id` (`event_schedule_id`),                                                                                                             
  KEY `tag_id` (`tag_id`),                                                                                                                                   
  CONSTRAINT `event_schedule_tag_ibfk_1` FOREIGN KEY (`event_schedule_id`) REFERENCES `event_schedule` (`id`)                                                
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci

我想在两列上添加主键。但是当我执行时

alter table event_schedule_tag add primary key(event_schedule_id, tag_id);

我得到: ERROR 1062 (23000): Duplicate entry '1130915-260' for key 'PRIMARY'

当我执行时

alter table event_schedule_tag drop primary key;

我得到: ERROR 1091 (42000): Can't DROP 'PRIMARY'; check that column/key exists

出路是什么?

编辑:我收到错误消息。我虽然说“主键已经存在”,但意思是:“表中有重复项-> 无法创建主键”现在更有意义了。 我删除了重复项并毫无问题地创建了主键。谢谢!

【问题讨论】:

  • 由于条目重复,没有创建主键。因此,尝试删除它是没有意义的。先删除重复项。
  • 参考stackoverflow.com/questions/27492732/…,这是您问题的答案。
  • ERROR 1062 (23000): Duplicate entry '1130915-260' for key 'PRIMARY' 表示计划 ID 1130915 与标签 ID 260 条目的组合不止一个。所以首先你应该先处理这种情况,然后你才能创建两者的复合键。
  • @Kapil 哦,现在我明白了!我没有得到正确的错误,虽然它说“已经有一个主键”
  • @JanKoutný 我已在答案中更新了我的 cmets。如果对您有帮助,请点赞或将其标记为答案。谢谢!

标签: mysql sql


【解决方案1】:

由于重复数据,您无法将约束添加到现有表中。假设您不想从现有表中删除任何内容,另一种方法是通过以下步骤进行:

  1. 使用LIKE 运算符创建另一个表(它将与event_schedule_tag 表具有相同的结构)
  2. 在该表上添加primary key 约束
  3. Insert 从当前表到新表的所有唯一行
  4. 重命名表或更改后端以使用新表。

SQL 语句如下所示:

CREATE TABLE `event_schedule_tag_unique` LIKE `event_schedule_tag`;

ALTER TABLE event_schedule_tag_unique add primary key(event_schedule_id, tag_id);

INSERT INTO event_schedule_tag_unique (event_schedule_id, tag_id)
SELECT event_schedule_id, tag_id FROM event_schedule_tag
GROUP BY event_schedule_id, tag_id
HAVING COUNT(*) = 1;

RENAME TABLE event_schedule_tag TO event_schedule_tag_archive;

RENAME TABLE event_schedule_tag_unique TO event_schedule_tag;

【讨论】:

    【解决方案2】:

    由于重复条目,从未创建主键。 所以,试图放弃它是没有意义的。 主键需要有唯一的值。所以,首先删除重复项以创建主键。

    【讨论】:

      猜你喜欢
      • 2016-12-17
      • 2019-04-10
      • 2023-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多