无法删除主键

时间:2017-04-14 11:10:10

标签: mysql sql

我有这张桌子:

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

出路是什么?

编辑:我收到错误消息错误。我虽然说'#34;主键已经存在"而意思是:"表中有重复 - >无法创建主键"这现在更有意义。 我删除了重复项并创建了主键,没有任何问题。谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

由于重复输入,从未创建主键。 所以,没有必要试图放弃它。 主键需要具有唯一值。因此,首先删除重复项以创建主键。