1

私はこのデータベース構造を持っています、

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。これは可能ですか?

4

1 に答える 1

1

インデックス付き != 1 のハッシュへの fk を使用してトラッカーが挿入されるたびにエラーを発生させたい場合は、アプリケーション レイヤーで実装する必要があります。

さまざまなオプション:

  • お気に入りのコーディング言語のチェック (挿入前に値をチェックするための後続のクエリ)
  • トリガーを使用して、トラッカーに挿入する前に、対応するハッシュがインデックス化されていることを確認し、そうでない場合はキャンセル/エラーを発生させます

乾杯

于 2012-06-11T20:10:31.330 に答える