使用mysql的外键是否可以根据列的值获得外键?

时间:2012-06-11 19:27:46

标签: mysql foreign-keys

我有这个数据库结构,

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

我认为这样可以确保哈希不会在没有哈希值的情况下出现在跟踪器中。如果哈希从哈希中删除,那么它也会从跟踪器中删除。

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

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

1 个答案:

答案 0 :(得分:1)

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

各种选择:

  • 最喜欢的编码语言检查(在插入之前检查值的后续查询)
  • 使用触发器,在插入跟踪器之前,检查相应的哈希是否已编入索引,如果不是取消/引发错误

欢呼声