MariaDB、Workbench 和删除时设置默认值

MariaDB, Workbench, and ON DELETE SET DEFAULT

我有一个不可为 null 的外键,在删除另一个 table 时需要将其设置为默认值。我正在使用 MariaDB,并从 MySQL Workbench.

中的模型导出 SQL 脚本

MariaDB 根据 https://mariadb.com/kb/en/sql-99/constraint_type-foreign-key-constraint/ 支持 ON DELETE SET DEFAULT MySQL 文档说虽然它是 "allowed by the MySQL Server, it is rejected as invalid by InnoDB."

所以我有两个问题:我可以确定 MariaDB 上的默认存储引擎是否支持它(或者上面的文档 link 只是暗示服务器本身支持它),并且假设它支持,如何解决 Workbench 不允许我设置该死的选项的问题?

所以,这个问题真的是两个个问题。

MariaDB 是否支持ON DELETE SET DEFAULT。是的。但是,更重要的问题是真的

MariaDB有没有支持ON DELETE SET DEFAULT的存储引擎?


我相信 MariaDB 会接受语法(在服务器级别)。但是当服务器将其传递给底层存储引擎时,存储引擎将拒绝并拒绝它。

例如,这可能能够使用 MyISAM 存储引擎将其传递给 tables。 (我不确定,我们从来没有在 MyISAM tables 上定义外键。)如果它确实传递给 MyISAM,那么说“它有效”就有点牵强了,因为什么都没有“外键”实际上适用于 MyISAM。 MyISAM 有效地忽略了外键约束。

我认为您引用的文档中有一条注释,MariaDB 有一个名为 PBXT 的存储引擎可以接受这个。但是 PBXT 的开发已经停止,并且在 MariaDB 5.5 中被禁用。要启用存储引擎,您必须在启用该引擎的情况下构建 MariaDB。但这完全是胡说八道,只是说“MariaDB 支持 ON DELETE SET DEFAULT”。

InnoDB 存储引擎不支持。 XtraDB 是一个改进的 InnoDB,但我不认为这是他们改进的地方。 (如果您使用的是 XtraDB,则值得快速测试一下。)

如果您为 table 使用 InnoDB 存储引擎,那么答案是 MariaDB 不支持 ON DELETE SET DEFAULT

如果您正在使用其他一些存储引擎,它可能会。但我认为 MariaDB 中唯一支持它的存储引擎是 PBXT。


参考:https://mariadb.com/kb/en/mariadb/foreign-keys/

The allowed actions for ON DELETE and ON UPDATE are:

SET DEFAULT: Only worked with PBXT. Similar to SET NULL, but the foreign key columns were set to their default values. If default values do not exist, an error is produced.


当然,解决方法是不依赖 FOREIGN KEY 约束规则来为您执行此操作。只需将规则设置为 ON DELETE RESTRICT。

并且在从父 table 中删除行之前,您可以对子 table 中的引用行执行更新,并且可以将这些行上的外键列设置为任何有效你想要的价值。然后,您可以从父项中删除行。