MariaDB、Workbench 和 ON DELETE SET DEFAULT
Posted
技术标签:
【中文标题】MariaDB、Workbench 和 ON DELETE SET DEFAULT【英文标题】:MariaDB, Workbench, and ON DELETE SET DEFAULT 【发布时间】:2015-08-15 13:55:08 【问题描述】:我有一个不可为空的外键,在删除另一个表时需要将其设置为默认值。我正在使用 MariaDB,并从 mysql Workbench 中的模型导出 SQL 脚本。
MariaDB 支持 ON DELETE SET DEFAULT 根据https://mariadb.com/kb/en/sql-99/constraint_type-foreign-key-constraint/ MySQL 文档说,虽然它“被 MySQL 服务器允许,但被 InnoDB 拒绝为无效。”
所以我有两个问题:我能否确定 MariaDB 上的默认存储引擎确实支持它(或者上面的文档链接是否只是暗示服务器本身支持它),并且,假设它支持它,我该如何解决Workbench 不让我设置该死的选项的问题?
【问题讨论】:
【参考方案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 允许的操作是:
设置默认值:仅适用于 PBXT。类似于 SET NULL,但外键列被设置为其默认值。如果默认值不存在,则会产生错误。
当然,解决方法是不要依赖 FOREIGN KEY 约束规则来为您执行此操作。只需将规则设置为 ON DELETE RESTRICT。
在从父表中删除行之前,您可以对子表中的引用行执行更新,并且可以将这些行上的外键列设置为所需的任何有效值。然后,您可以从父级中删除行。
【讨论】:
感谢您的详细回答。以上是关于MariaDB、Workbench 和 ON DELETE SET DEFAULT的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 MySQL Workbench 访问 Mariadb (Centos 7)
寻找 MySQL Workbench 的替代品以与 MariaDB 10 一起使用
如何以通过 ed25519 识别的用户身份使用 MYSQL Workbench 连接到 MariaDB (10.5.8)?
连接到 MariaDb 时出现 MySql Workbench 错误。表“performance_schema.user_variables_by_thread”不存在