MariaDB,Workbench和ON DELETE SET DEFAULT

时间:2015-06-01 23:09:47

标签: mysql mysql-workbench mariadb

我有一个不可为空的外键,我需要在删除另一个表时将其设置为默认值。我正在使用MariaDB,并从MySQL Workbench中的模型导出SQL脚本。

根据https://mariadb.com/kb/en/sql-99/constraint_type-foreign-key-constraint/,MariaDB支持ON DELETE SET DEFAULT MySQL文档说,虽然它是“MySQL服务器允许的,但它被InnoDB拒绝为无效。”

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

1 个答案:

答案 0 :(得分:1)

所以,问题实际上是两个问题。

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

MariaDB是否有任何支持ON DELETE SET DEFAULT的存储引擎?

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

例如,这可以使用MyISAM存储引擎将其传递给表。 (我不确定,我们永远不会在MyISAM表上定义外键。)如果它确实传递给了MyISAM,那么说它“有效”将是一个延伸,因为没有任何“外键”实际工作与MyISAM。 MyISAM有效地忽略了外键约束。

我认为您引用的文档中有一条说明MariaDB有一个名为 PBXT 的存储引擎可以接受这个。但是PBXT的开发已经停止,并且它在MariaDB 5.5中被禁用。要启用存储引擎,您必须使用已启用的MariaDB进行构建。但这是一个完整的僵局,只是说“MariaDB支持ON DELETE SET DEFAULT”。

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

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

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

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

  

ON DELETE和ON UPDATE的允许操作是:

     

SET DEFAULT:仅适用于PBXT。与SET NULL类似,但外键列设置为其默认值。如果默认值不存在,则会产生错误。

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

在从父表中删除行之前,可以在引用子表中的行时执行更新,并且可以将这些行上的外键列设置为所需的任何有效值。然后,您可以从父级删除行。