2017-04-14 64 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

主鍵從來沒有得到創建由於重複條目。 因此,試圖放棄它沒有任何意義。 主鍵需要具有唯一值。因此,首先刪除重複項以創建主鍵。