【发布时间】:2012-08-24 04:07:15
【问题描述】:
我在 MySQL 5.5.24 版本中有下表
DROP TABLE IF EXISTS `momento_distribution`;
CREATE TABLE IF NOT EXISTS `momento_distribution`
(
`momento_id` INT(11) NOT NULL,
`momento_idmember` INT(11) NOT NULL,
`created_at` DATETIME DEFAULT NULL,
`updated_at` DATETIME DEFAULT NULL,
`unread` TINYINT(1) DEFAULT '1',
`accepted` VARCHAR(10) NOT NULL DEFAULT 'pending',
`ext_member` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`momento_id`, `momento_idmember`),
KEY `momento_distribution_FI_2` (`momento_idmember`),
KEY `accepted` (`accepted`, `ext_member`)
)
ENGINE=InnoDB
DEFAULT CHARSET=latin1;
它有大量数据与其他两个表具有多对一关系,ondelete=restrict 和 onupdate=restrict。
现在,我需要更改结构并在表中引入单独的主键,同时仍保留现有的关系和数据。为此,我执行了以下查询:
ALTER TABLE `momento_distribution` ADD `id` INT( 11 ) NOT NULL FIRST;
ALTER TABLE `momento_distribution` DROP PRIMARY KEY , ADD PRIMARY KEY ( `id` );
很遗憾,我的第二个查询失败并出现以下错误:
1062 - 键“PRIMARY”的重复条目“0”
有人可以指出问题吗?我想问题是现有的关系,但我不想丢失现有的关系或数据,它有几千行。有什么方法可以做到这一点而不会丢失数据?
编辑: 通过查看数据,我得知新创建的列中包含值“0”。由于重复记录(在新主键中),这可能不允许更改主键
我有超过 8,000 行,因此无法手动更改。有没有办法将rowid 分配给新的主键?
【问题讨论】:
-
您的编辑解释说您的默认值为 0 帮助了我。好像在我的情况下,我的表是在添加 auto_increment 之前创建的(没有 id,默认为 0)
-
我曾经有同样的错误。就我而言,问题在于我正在管理一个非空表。我通过做 TRUNCATE TABLE name_table 解决了,然后我能够添加主键