无法添加外键约束

jdg4fx2g  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(355)

我有两张table: user 以及 user_session_data ```
CREATE TABLE user (
id int(11) NOT NULL AUTO_INCREMENT,
[ ... more columns ... ]
PRIMARY KEY (id),
[ ... some unique keys ... ]
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=COMPRESSED

以及

CREATE TABLE user_session_data (
id int(11) NOT NULL AUTO_INCREMENT,
user_id int(11) DEFAULT NULL,
[ ... more columns ... ]
PRIMARY KEY (id),
[ ... some unique keys ... ]
KEY IDX_abcdefg (user_id),
[ ... more indexes ... ]
CONSTRAINT FK_abcdefg FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE,
[ ... more similar foreign key constraints ... ]
) ENGINE=InnoDB AUTO_INCREMENT=11334248 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=COMPRESSED

在某个时候,有人创建了 `user_session_data` ,比如说 `user_session_data_COPY` ,修复了其中一些不正确的数据,然后重命名了表: `user_session_data` > 
user_session_data_ORIGINAL `user_session_data_COPY` >  `user_session_data` 因此,所有约束都与原始表保持链接。
现在,我必须解决这个问题,所以我删除了原始表上的约束,并尝试将它们添加到新表上。除了上面表结构中突出显示的约束之外,所有约束都已成功创建(到其他一些表)。只是不会。
这些表有许多记录(数百万条),因此查询大约运行10分钟。我只能访问phpmyadmin接口,在运行查询5分钟后,它告诉我#2006-mysql服务器已经消失了。但是,在重新创建其他约束时也会发生这种情况,它们工作得很好。跑步 `SHOW FULL PROCESSLIST;` 显示查询正在后台运行。
无论如何,当它完成时(查询从进程列表中消失),约束就不存在了。mysql常规日志记录被禁用,我没有权限启用它来查看是否在某个时候出现了错误。
我试着在原始表(记录较少)上添加约束,但效果很好。
我还尝试通过运行一些空sql来重建索引(重新创建表),就像mysql文档所建议的那样:

ALTER TABLE user_session_data ENGINE = InnoDB;
ALTER TABLE user ENGINE = InnoDB;

但仍然没有成功。
我还有别的选择吗?
谢谢您!
enyaitl3

enyaitl31#

请检查您的数据是否一致。

Select count (*) from user_session_data     where user_id not in (select ID from user_data)

如果有任何结果,请从用户会话数据中删除错误的数据,然后重试。

相关问题