2017-04-14 63 views
0

我有这个表:不能删除或者添加主键

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

何处是路?

编辑:我得到错误信息错误。我虽然说“主键已经存在”,但其含义是:“表中有重复 - >无法创建主键”,这使得现在更加合理。 我删除了重复项,并创建了没有问题的主键。谢谢!

+3

主键没有被创建,因为重复条目。所以,没有意义的试图放弃它。首先删除重复项。 – Kapil

+0

请参阅http://stackoverflow.com/questions/27492732/mysql-duplicate-error-with-alter-ignoretable,这是您的问题的答案。 – Anil

+0

'错误1062(23000):关键'PRIMARY''的重复条目'1130915-260'表示标记id为260的条目组合的日程表ID 1130915不止一个。所以首先你应该首先处理这种情况,然后你可以创建两者的组合键。 –

回答

0

由于重复数据,您无法将约束添加到现有表中。假设你不想删除现有的表什么,另一种方法是通过以下步骤来做到这一点:

  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; 
0

主键从来没有得到创建由于重复条目。 因此,试图放弃它没有任何意义。 主键需要具有唯一值。因此,首先删除重复项以创建主键。