我刚刚在我的开发计算机上将 MariaDB 服务器从 10.6.10 更新到 10.6.15,并且尝试恢复以前工作的 SQL 转储现在失败了。
以下是失败查询的示例:
CREATE TABLE `lin_98_41_strumenti_categorie` (
`id_categoria` int(10) unsigned NOT NULL AUTO_INCREMENT,
`id_azienda` int(10) unsigned NOT NULL DEFAULT 1,
`id_sede` int(10) unsigned NOT NULL DEFAULT 1,
`revisione_documento` int(10) unsigned NOT NULL DEFAULT 0,
`id_macchina` int(10) unsigned DEFAULT NULL,
`id_attrezzo` int(10) unsigned DEFAULT NULL,
`id_impianto` int(10) unsigned DEFAULT NULL,
`id_opera_provvisionale` int(10) unsigned DEFAULT NULL,
`tipo_strumento` char(1) GENERATED ALWAYS AS (concat_ws('',if(`id_macchina` is not null,'M',NULL),if(`id_attrezzo` is not null,'A',NULL),if(`id_impianto` is not null,'I',NULL),if(`id_opera_provvisionale` is not null,'O',NULL))) VIRTUAL,
PRIMARY KEY (`id_categoria`,`id_azienda`,`id_sede`,`revisione_documento`),
UNIQUE KEY `unique_id_macchina_lin_98_41_strumenti_categorie` (`id_macchina`,`id_azienda`,`id_sede`,`revisione_documento`),
UNIQUE KEY `unique_id_attrezzo_lin_98_41_strumenti_categorie` (`id_attrezzo`,`id_azienda`,`id_sede`,`revisione_documento`),
UNIQUE KEY `unique_id_impianto_lin_98_41_strumenti_categorie` (`id_impianto`,`id_azienda`,`id_sede`,`revisione_documento`),
UNIQUE KEY `unique_id_opera_provvisionale_lin_98_41_strumenti_categorie` (`id_opera_provvisionale`,`id_azienda`,`id_sede`,`revisione_documento`),
KEY `fk_main_lin_98_41_strumenti_categorie` (`id_azienda`,`id_sede`,`revisione_documento`),
CONSTRAINT `fk_id_attrezzo_lin_98_41_strumenti_categorie` FOREIGN KEY (`id_attrezzo`) REFERENCES `agews_attrezzi` (`id_attrezzo`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_id_impianto_lin_98_41_strumenti_categorie` FOREIGN KEY (`id_impianto`) REFERENCES `agews_impianti` (`id_impianto`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_id_macchina_lin_98_41_strumenti_categorie` FOREIGN KEY (`id_macchina`) REFERENCES `agews_macchine` (`id_macchina`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_id_opera_provvisionale_lin_98_41_strumenti_categorie` FOREIGN KEY (`id_opera_provvisionale`) REFERENCES `agews_opere_provvisionali` (`id_opera_provvisionale`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_main_lin_98_41_strumenti_categorie` FOREIGN KEY (`id_azienda`, `id_sede`, `revisione_documento`) REFERENCES `lin_98_41` (`id_azienda`, `id_sede`, `revisione_documento`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
错误位于GENERATED ALWAYS
标记为 的最后一个字段中STORED
,如果我手动将类型更改为VIRTUAL
有效。
错误只是说:
ERROR 1901 (HY000) at line 420329: 函数或表达式 'id_macchina' 不能在 GENERATED ALWAYS AS 子句中使用
tipo_strumento
但它没有给出任何有用的指示来说明为什么现在不能使用它。
然而,这个 SQL 转储在 10.6.10 版本中无需修改即可工作,是否有可能在最新的 10.6 版本中存在这种向后不兼容的更改?我查看了发行说明,但没有发现任何可以证明此类重大更改的合理性。
最后我通过在 MariaDb 的错误跟踪器上创建票证发现了发生了什么,看来这是故意的: