MySql-无法添加外键约束

时间:2018-06-20 08:04:14

标签: mysql foreign-keys constraints database-indexes

我有两个表:useruser_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服务器已消失。但是,在重新创建其他约束时也发生了这种情况,它们工作得很好。运行SHOW FULL PROCESSLIST;表示查询正在后台运行。

无论如何,当它完成(查询从进程列表中消失)时,约束就不存在了。 MySql常规日志记录已禁用,我无权启用它以查看是否在某些时候出现错误。

我尝试将约束添加到ORIGINAL表(记录较少)上,并且工作正常。

我还尝试通过运行一些空sql来重建索引(重新创建表),就像MySql文档建议的那样:

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

但仍然没有成功。

我还有其他选择吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

如果这样可以给您带来任何结果,请从user_session_data中删除错误的数据,然后重试。