MySql - 无法添加外键约束
MySql - Unable to add foreign key constraint
我有两个 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
,修复了上面的一些错误数据,然后将 table 重命名为:
user_session_data
> user_session_data_ORIGINAL
user_session_data_COPY
> user_session_data
所以所有约束都与原始 table 保持联系。
现在,我必须解决这个问题,所以我放弃了对原始 table 的限制,蚂蚁试图将它们添加到新的 table 上。所有约束都已成功创建(对其他 tables),除了上面 table 结构中突出显示的约束。就是不会。
tables 有很多记录(数百万)所以查询运行大约 10 分钟。我只能访问 phpMyAdmin 界面,在 运行 查询 5 分钟后告诉我 #2006 - MySQL 服务器已经消失 。但是,在重新创建其他约束时也会发生这种情况,并且它们工作得很好。 运行 SHOW FULL PROCESSLIST;
表明查询是 运行 在后台。
无论如何,当它完成时(查询从进程列表中消失),约束就不存在了。 MySql 常规日志记录已禁用,我无权启用它以查看我是否在某个时候遇到错误。
我尝试在 ORIGINAL table(记录较少)上添加约束,但效果很好。
我还尝试通过 运行 一些空 sql 重建索引(重新创建 tables),正如 MySql 文档所建议的那样:
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 中删除错误的数据,然后重试。
我有两个 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
,修复了上面的一些错误数据,然后将 table 重命名为:
user_session_data
> user_session_data_ORIGINAL
user_session_data_COPY
> user_session_data
所以所有约束都与原始 table 保持联系。
现在,我必须解决这个问题,所以我放弃了对原始 table 的限制,蚂蚁试图将它们添加到新的 table 上。所有约束都已成功创建(对其他 tables),除了上面 table 结构中突出显示的约束。就是不会。
tables 有很多记录(数百万)所以查询运行大约 10 分钟。我只能访问 phpMyAdmin 界面,在 运行 查询 5 分钟后告诉我 #2006 - MySQL 服务器已经消失 。但是,在重新创建其他约束时也会发生这种情况,并且它们工作得很好。 运行 SHOW FULL PROCESSLIST;
表明查询是 运行 在后台。
无论如何,当它完成时(查询从进程列表中消失),约束就不存在了。 MySql 常规日志记录已禁用,我无权启用它以查看我是否在某个时候遇到错误。
我尝试在 ORIGINAL table(记录较少)上添加约束,但效果很好。
我还尝试通过 运行 一些空 sql 重建索引(重新创建 tables),正如 MySql 文档所建议的那样:
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 中删除错误的数据,然后重试。