2012-06-11 44 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