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=restrictonupdate=restrict的多对一关系.

现在,我需要改变 struct ,在表中引入单独的主键,同时保留现有的关系和数据.为此,我执行了以下查询:

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"

有人能指出这个问题吗?我想问题在于现有的关系,但我不想丢失现有的关系或数据,它有几千行.有没有办法做到这一点而不丢失数据?

EDIT:

我有8000多行,所以无法手动更改.有没有办法将rowid分配给一个新的主键?

推荐答案

在mysql控制台中运行以下查询:

SHOW CREATE TABLE momento_distribution

判断有没有像这样的线

CONSTRAINT `momento_distribution_FK_1` FOREIGN KEY (`momento_id`) REFERENCES `momento` (`id`)

可能不一样,我只是猜测一下可能是什么.如果你的"momento_id"和"momento_id"都是foreign keymomento_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查询中得到的名称.现在你没有任何外键,所以你可以很容易地删除primary key.try 以下方法:

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 

希望有帮助.如果你有任何错误,请用参考表格的 struct 编辑问题;您得到的错误代码.

Mysql相关问答推荐

正则表达式转换为MYSQL格式

使用JSON_CONTAINS搜索多个值的原理

MySQL嵌套的内连接使查询变得很慢-解决方案?

奇怪的MySQL SELECT循环;但不是\G

Python - 执行原始 SQL 时获取更新查询 (Mysql) 的结果

MySQL 搜索列字段字符串

获取最大登录应用程序用户数以及何时

从 NextJS/Prisma 添加用户 ID (FK) 到 MySQL 表

带有 JOIN 和 WHERE 子句的 INSERT 语句

SQL / MySQL:如何在WHERE IN中判断类似于OR的AND逻辑

MYSQL如何将虚拟列添加到现有表中

在 PHP 中获取 MySQL 列的总和

MySQL - 如何在 INSERT 语句中将字符串值解析为 DATETIME 格式?

有什么方法可以显示`gunzip < database.sql.gz | 的进度? mysql ...`进程?

MySQL嵌套 Select 查询?

如何将时刻 JS 时间插入 MySQL

如何在 python 中逐行获取 MySQL ResultSet

什么是全文索引,我应该什么时候使用它?

从 MySQL JSON 数据类型中提取不带引号的值

获得上个月的第一天和最后一天的最佳方式?