gpt4 book ai didi

mysql - 防止两个外键同时为NULL

转载 作者:行者123 更新时间:2023-12-02 00:49:51 25 4
gpt4 key购买 nike

在 MySQL/MariaDB 中,如何防止两个外键同时为 NULL?起初这看起来很简单,我使用了一个 CREATE 语句约束,如下所示:

CREATE TABLE `Table` (
`foo_id` INT UNSIGNED UNIQUE DEFAULT NULL,
`bar_id` INT UNSIGNED UNIQUE DEFAULT NULL,
CONSTRAINT `CHECK_keys_present` CHECK (
((`foo_id` IS NOT NULL) OR (`bar_id` IS NOT NULL)) != FALSE
),
FOREIGN KEY (`foo_id`) REFERENCES `Foo` (`foo_id`) ON UPDATE CASCADE ON DELETE SET NULL,
FOREIGN KEY (`bar_id`) REFERENCES `Bar` (`bar_id`) ON UPDATE CASCADE ON DELETE SET NULL
);

只要我手动更新列 foo_idbar_id 中的值,此解决方案就有效。在这种情况下,列不会同时变为 NULL。但是,当我从表 FooBar 中删除行时(然后将外键的值设置为 NULL 因为 ON UPDATE 子句)约束 CHECK_keys_present 不会触发。

此外,我尝试过使用 BEFORE UPDATE 触发器,但这些似乎都不起作用。

我使用的是 MariaDB 10.4.8 版。

我还使用了奇怪的 ((`foo_id` IS NOT NULL) OR (`bar_id` IS NOT NULL)) != FALSE 构造,因为只有 (`foo_id` IS NOT NULL) OR (`bar_id` IS NOT NULL) 无效。

最佳答案

这不是一个完整的答案,因为我还没有找到特定于 check 约束的引用。然而,MariaDB does not enforce triggers on foreign key cascades :

The following restrictions apply to triggers.

. . . - Triggers are not activated by foreign key actions.

我推测 check 约束属于同一类别。

这意味着您无法使用级联外键约束执行您想要的操作。

关于mysql - 防止两个外键同时为NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58719070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com