gpt4 book ai didi

mysql - mysql 的外键是否可以有一个基于列值的外键?

转载 作者:行者123 更新时间:2023-11-29 00:44:28 25 4
gpt4 key购买 nike

我有这个数据库结构,

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

CREATE TABLE IF NOT EXISTS `announces` (
`tracker` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`failCount` smallint(5) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`tracker`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS `hashes` (
`hash` binary(20) NOT NULL,
`indexed` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS `trackers` (
`hash` binary(20) NOT NULL,
`tracker` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`seeders` mediumint(8) unsigned NOT NULL DEFAULT '0',
`leechers` mediumint(8) unsigned NOT NULL DEFAULT '0',
KEY `hashFK` (`hash`),
KEY `trackerFK` (`tracker`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `trackers`
ADD CONSTRAINT `hashFK` FOREIGN KEY (`hash`) REFERENCES `hashes` (`hash`)
ON DELETE CASCADE,
ADD CONSTRAINT `trackerFK` FOREIGN KEY (`tracker`) REFERENCES `announces` (`tracker`)
ON DELETE CASCADE;

表跟踪器有 2 个外键,一个用于跟踪器,一个用于哈希。

我认为这可以确保散列不能在没有首先进入散列的情况下进入跟踪器。如果从散列中删除一个散列,那么它也会从跟踪器中删除。

对于跟踪器也是如此,跟踪器必须存在于公告中才能存在于跟踪器中,如果它从公告中删除,它也会从跟踪器中删除。

我遇到的问题是,如果 hashes 行中 indexed 的对应值为 == 1,那么哈希值应该只存在于跟踪器中>。这可能吗?

最佳答案

如果您希望在使用 fk 将跟踪器插入索引为 != 1 的哈希时引发错误,那么它必须在应用层实现。

各种选项:

  • 最喜欢的编码语言检查(插入前检查值的后续查询)
  • 使用触发器,在插入到跟踪器之前,检查相应的散列是否被索引,如果没有则取消/引发错误

干杯

关于mysql - mysql 的外键是否可以有一个基于列值的外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10986310/

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