4

次のテーブルレイアウトを使用します。

TABLE Something
(
    SomethingId             
    Name      
    DateCreated
    IsObsolete ('Y','N')       
    PRIMARY KEY (SomethingId)
    Foreign Key (SomethingTypeCode)
;


TABLE SomethingType
(
    SomethingTypeCode ('1','2','3')             
    Description             
    PRIMARY KEY (SomethingTypeCode)
);

PHP / MySQLのセットアップでは、Somethingテーブルで識別されるSomethingTypeCode(1、2、3)ごとに、IsObsolete = Nを1つだけ関連付けることができるという制約またはインデックスを介して制限できる方法がありますか?

それが私が達成しようとしていることを説明することを願っています。これを解決するために何を調べればよいのかわかりません。データベース自体でデータの整合性を可能な限り維持し、それをPHPに拡張したいと思います。


編集:

混乱に応えて、私はVoteyDiscipleの答えを得ています。

EmailTypeCode:P =個人、B =ビジネス、S=学校

これが私のデザインです:

ここに画像の説明を入力してください

これにより、個人は特定のタイプコードに複数のタイプの電子メール(つまり、2つのビジネス電子メール)を持つことができ、データベースでの重複を回避し、nullを必要としません。私は、IsObsoleteが機能する場所である各カテゴリ(システムで使用されるもの)にアクティブな電子メールを1つだけ持つことに関心があるためです。履歴を保持し、重複を回避し、nullを回避し、ここでシステムに一意の電子メールアドレスが入力されていることを確認できます。

もちろん、これは元の質問で述べたように私の問題も引き起こします。

VoteyDiscipleのアプローチ

間違った(または正しい)描写があった場合は、VoteyDiscipleまでお知らせください。

ここに画像の説明を入力してください

「特定のタイプに対して1つしか存在できない場合」-システム内で1つだけでなく、一度に1つだけアクティブになります。
「ActiveIdをNULLにすることができます」-NULLは必要ないことを強調し
ました。「または、特定のSomethingレコードを指すことができます。」タイプはレコードを定義します。

上記の私の応答に加えて、これはクエリに元に戻る複雑さを追加するようです。私の回答は、あなたが提示したものについての私の理解に基づいています。私たちはお互いを理解していないか、それは私の側にあるだけです。ご意見をいただければ幸いですが、提示されたとおり、実行可能な解決策とは考えていません。

4

2 に答える 2

1

MySQL トリガーでこれを処理できるはずです。

DELIMITER $$
CREATE TRIGGER before_something_update 
BEFORE UPDATE ON Something
FOR EACH ROW BEGIN
   IF NEW.IsObsolete = 'N' THEN
      UPDATE Something SET IsObsolete = 'Y' WHERE SomethingId != NEW.SomethingId AND SomethingTypeID = NEW.SomethingTypeId;
   END IF; 
DELIMITER ;

そして、挿入時に似たようなもの。トリガーは、IsObelete を N に設定しようとしているかどうかを確認し、現在の行ではない同じタイプのすべての行を更新して Y に設定しようとしているかどうかを確認します。

InnoDB を使用している場合、デッドロックの問題が発生する可能性がありますが、MyISAM では問題が発生しないと思います。

于 2011-05-13T17:00:32.793 に答える
0

特定のタイプに 1 つしかない場合、それは のプロパティでありSomethingType、 のプロパティではありませんSomething

TABLE SomethingType
(
    SomethingTypeCode ('1','2','3')             
    ActiveId
    Description             
    PRIMARY KEY (SomethingTypeCode)
    Foreign Key (Something)
);

(このSomethingTypeに廃止されていないSomethingがないことを示す)、または特定のレコードを指すことがActiveIdできます。NULLSomething

そして、明らかにそこに複数の ID を入れることはできないので、アクティブなアイテムが 0 個または 1 個あることが保証されます。

于 2011-05-12T01:21:11.650 に答える