mysql - MySql - 无法添加外键约束
问题描述
我有两张桌子: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
所以所有的约束都与 ORIGINAL 表保持联系。
现在,我必须解决这个问题,所以我删除了 ORIGINAL 表上的约束,蚂蚁试图将它们添加到新表上。除了上面表结构中突出显示的约束之外,所有约束都已成功创建(对其他一些表)。它只是不会。
这些表有许多记录(数百万),因此查询运行大约 10 分钟。我只能访问 phpMyAdmin 界面,运行查询 5 分钟后告诉我#2006 - MySQL server has gone away。但是,在重新创建其他约束时也会发生这种情况,并且它们工作得很好。运行SHOW FULL PROCESSLIST;
显示查询正在后台运行。
无论如何,当它完成时(查询从进程列表中消失),约束不存在。MySql 常规日志记录被禁用,我无权启用它以查看我是否在某些时候遇到了一些错误。
我试图在 ORIGINAL 表(记录较少)上添加约束,它工作得很好。
正如 MySql 文档所建议的那样,我还尝试通过运行一些空 sql 来重建索引(重新创建表):
ALTER TABLE user_session_data ENGINE = InnoDB;
ALTER TABLE user ENGINE = InnoDB;
但仍然没有成功。
还有其他我应该尝试的选择吗?
谢谢!
解决方案
请检查您的数据是否一致。
Select count (*) from user_session_data where user_id not in (select ID from user_data)
如果这给了您任何结果,请从 user_session_data 中删除错误的数据,然后重试。
推荐阅读
- python - 编辑要求用户名的程序。它应该检查前四个字符是字母,第五个和第六个是数字。在 Python 中
- r - 使用整洁的评估过滤我自己的功能
- javascript - 从经过消毒的 html 中设置 innerHtml 仍然很危险吗?
- python - 导入外部 Python 项目的最佳方式
- sql - 雪花 SQL 区间之间的范围
- javascript - How to cancel file upload in Vue
- slider - html、css、js 滑块图像在窗口调整大小时折叠
- python - 从 az.plot_ppc 观察到的曲线与实际数据的 kde 图不匹配
- javascript - 在 Elm 中编辑起始页
- asp.net - 为记录和更新字段中的行创建按钮