创建MySQL';使用用于外键约束的列生成的列会导致错误

创建MySQL';使用用于外键约束的列生成的列会导致错误,mysql,foreign-keys,innodb,mysql-5.7,generated-columns,Mysql,Foreign Keys,Innodb,Mysql 5.7,Generated Columns,我尝试将生成的存储列添加到运行以下SQL命令的现有表中: ALTER TABLE routes ADD routes_hash char(32) AS (MD5(CONCAT(`traveler_id`, `track`))) stored; MySQL返回错误消息: ERROR 1025 (HY000): Error on rename of './travelers/#sql-558_69' to './travelers/routes' (errno: 15

我尝试将生成的存储列添加到运行以下SQL命令的现有表中:

ALTER TABLE routes ADD routes_hash char(32)
      AS (MD5(CONCAT(`traveler_id`, `track`))) stored;
MySQL返回错误消息:

ERROR 1025 (HY000): Error on rename of './travelers/#sql-558_69' to './travelers/routes'
         (errno: 150 - Foreign key constraint is incorrectly formed)
Mysql版本是5.7.20。以下是一个数据库结构:

CREATE TABLE `travelers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(128) NOT NULL,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `routes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `traveler_id` int(11) NOT NULL,
  `track` multilinestring NOT NULL,
  PRIMARY KEY (`id`),
  KEY `traveler_id` (`traveler_id`),
  CONSTRAINT `routes_ibfk_1` FOREIGN KEY (`traveler_id`)
        REFERENCES `travelers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

我在MySQL文档中没有发现任何限制,禁止将参与外键约束的列作为用于生成列的表达式的一部分使用。但是,如果我从为
routes\u hash
生成的列表达式中排除
traveler\u id
,则可以很好地创建列。这是MySQL的一个bug还是我缺少了一些关于生成列使用的信息?

不幸的是,MySQL的一个bug甚至影响到当前的5.7和8.0版本。我在MySQL的bug追踪器上找到了描述。请注意。

添加生成的列显然会导致重新创建整个表,当mysql尝试重新创建外键时,您会收到错误消息。检查innodb状态监视器以查看确切的错误消息。毫无疑问,
SHOW ENGINE innodb status
的输出中缺少“LATEST FOREIGN KEY error”部分,这意味着未检测到任何外键错误。我可以在没有任何数据的情况下复制它。对我来说,它看起来像一只虫子。请注意,如果删除
存储的
属性,它会起作用。@PaulSpiegel我敢说,如果没有存储的属性,就不必重新创建表。@Shadow我想你是对的。但你也会有同样的问题。我认为他们很难将存储生成的列与级联操作结合起来。触发器也存在类似的问题。他们不是被连锁反应解雇的。谢谢你的信息,这让我发疯了!作为一种解决方法,我使用的是
虚拟
而不是
存储