我在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给新的主键吗?
在mysql控制台中运行以下查询:
SHOW CREATE TABLE momento_distribution 检查看起来像这样的行
CONSTRAINT momento_distribution_FK_1
FOREIGN KEY (momento_id
) REFERENCES momento
(id
) 可能会有所不同,我只是猜测可能会是什么。如果您在'momento_id'和'momento_idmember'上都具有外键,则将获得两个外键名称。下一步是删除外键。运行以下查询:
ALTER TABLE momento_distribution DROP FOREIGN KEY momento_distribution_FK_1 ALTER TABLE momento_distribution DROP FOREIGN KEY momento_distribution_FK_2 确保将外键名称更改为您从CREATE TABLE查询中获得的名称。现在,您没有任何外键,因此可以轻松删除主键。请尝试以下操作:
ALTER TABLE momento_distribution
DROP PRIMARY KEY 添加所需的列,如下所示:
ALTER TABLE momento_distribution
ADD id
INT( 11 ) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST 该查询还会添加数字,因此您无需依赖@rowid。现在,您需要将外键添加回前面的列。为此,首先创建以下索引:
ALTER TABLE momento_distribution
ADD INDEX ( momento_id
) ALTER TABLE momento_distribution
ADD INDEX ( momento_idmember
) 现在添加外键。根据需要更改参考表/列:
ALTER TABLE momento_distribution
ADD FOREIGN KEY ( momento_id
) REFERENCES momento
(id
) ON DELETE RESTRICT ON UPDATE RESTRICT ALTER TABLE momento_distribution
ADD FOREIGN KEY ( momento_idmember
) REFERENCES member
(id
) ON DELETE RESTRICT ON UPDATE RESTRICT 希望能有所帮助。如果您遇到任何错误,请使用参考表的结构以及所得到的错误代码来编辑问题。来源:stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。