2012-06-11 48 views
1

我有这样的数据库结构,用mysql的外键有可能有一个基于列值的外键?

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个外键一个用于跟踪器,一个用于哈希值。

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

跟踪器一样,跟踪器必须存在于通告中,才能存在于跟踪器中,并且如果它从通知中删除,它也会从跟踪器中删除。

我的问题是,哈希应该跟踪只存在如果indexedhashes行中的对应值为== 1。这可能吗?

+0

你想设置索引= 1到只要跟踪器插入朝向它FK哈希?或者,也许您希望每当使用fk将跟踪器插入到索引为!= 1的哈希中时引发错误? – Sebas

+0

最好后者,据我了解手册,我不认为我可以添加外键的触发器?谢谢 – Griff

回答

1

如果你希望每当用fk将一个跟踪器插入到索引为!= 1的散列中时引发错误,那么它必须在应用层实现。

各种选项:使用触发器

  • 喜爱编码语言检查(后续查询到插入之前检查值)
  • ,之前插入到跟踪器,检查相应的散列索引,并且如果不消除/提高错误

欢呼

+0

但是也许应该进行更全面的分析?也许每当一个散列索引,它应该有一个跟踪立即插入?也许当用户决定从哈希创建一个跟踪器时,他应该只能选择索引散列?我不知道你的系统的性质,但你明白了我的观点。 – Sebas

+0

你这有道理,只需要调整很多东西来让它工作:) – Griff