簡體   English   中英

MySQL的外鍵是否可以基於列的值有一個外鍵?

[英]Foreign keys with mysql is it possible to have a foreign key based on value of column?

我有這個數據庫結構,

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 ,則hashes僅應存在於跟蹤器中。 這可能嗎?

如果您希望在將跟蹤器和fk插入索引為!= 1的哈希時引發錯誤,則必須在應用層實現該錯誤。

多種選擇:

  • 最喜歡的編碼語言檢查(后續查詢以在插入之前檢查值)
  • 使用觸發器,在插入跟蹤器之前,請檢查是否已索引相應的哈希,如果沒有,則取消/引發錯誤

干杯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM