Mysql Can';不要删除或添加主键
我有这张桌子:Mysql Can';不要删除或添加主键,mysql,sql,Mysql,Sql,我有这张桌子: CREATE TABLE `event_schedule_tag` ( `event_schedule_id` bigint(20) NOT NULL,
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\u schedule\u tag add主键(event\u schedule\u id,tag\u id)代码>
我得到:
错误1062(23000):键“PRIMARY”的重复条目“1130915-260”
当我执行
alter table event\u schedule\u tag drop主键代码>
我得到:
错误1091(42000):无法删除'PRIMARY';检查列/键是否存在
出路是什么
编辑:我把错误信息弄错了。我想它说的是“主键已经存在”,而它的意思是:“表中有重复项->不能创建主键”,这现在更有意义了。
我删除了重复项,并毫无问题地创建了主键。谢谢 由于数据重复,无法将约束添加到现有表中。假设您不想从现有表中删除任何内容,另一种方法是通过以下步骤执行:
使用LIKE
操作符创建另一个表(它的结构将与事件\计划\标记
表相同)
在该表上添加主键
约束
插入当前表到新表中的所有唯一行
重命名表或更改后端以使用新表
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;
由于重复条目,从未创建主键。
所以,放弃它是没有意义的。
主键需要具有唯一的值。因此,请先删除重复项以创建主键。由于重复项,主键未被创建。因此,尝试删除它没有意义。首先删除重复项。请参阅,这是您问题的答案。错误1062(23000):键“PRIMARY”的重复项“1130915-260”
表示计划id 1130915与标记id 260项的组合不止一个。所以首先你应该先处理这种情况,然后才能创建两者的复合密钥。@Kapil哦,现在我明白了!我没有正确理解erorr,因为它说“已经有一个主键了”@JanKoutný我已经在答案中更新了我的评论。如果它对你有帮助,请升级投票或将其标记为答案。谢谢