2012-03-08 13 views
0

私は2つのテーブル、顧客および関連会社を持っています。 customers.emailとaffiliates.emailが排他的であることを確認する必要があります。言い換えれば、ある人は顧客でも、関係者でもない。これは基本的に外部キーの反対です。これを行う方法はありますか?mysqlの外部キーと反対側

答えて

1

あなたは電子メールを保存し、電子メールでのユニーク制約を持つテーブルを使用して、顧客や関連会社からそのテーブルを参照することができます。 (同じキーを参照する2つのレコードがないことを確認する必要があります)

挿入前と更新前にトリガーを使用して電子メールが存在しないかどうかを確認できます。

または、この検証はアプリケーションロジックに任せることができます。データベース内ではなく、アプリケーションコード内に置くことができます。

+1

あなたの最初の解決策は、customersテーブルとaffiliatesテーブルが両方とも電子メールのテーブル内の単一のレコードを参照しないようにしますか? – octern

+0

はい、オクタンに同意します。しかし、あなたの答えの第二の部分は合法です。それをアプリケーションロジックに任せて(新しいレコードを挿入する前にチェックを実行するのが最も簡単な方法です)あなたの答えを編集すれば、私はそれを受け入れます。 – user617123

+0

@ user617123メモを取って、回答を編集しました。 –

1

キーはありませんが、2つのテーブルを使用しないでください。代わりに、顧客/アフィリエイトデータ(このテーブルで一意である必要があります)とタイプ(顧客/アフィリエイト)を持つ別のテーブルのいずれかを持つ1つのテーブルを持つことができます。

CREATE TABLE People (
    pplid, 
    pplEmail, 
    ptid, 
    UNIQUE KEY (pplEmail) 
) 
CREATE TABLE PeopleType (
    ptid, 
    ptType 
) 
INSERT INTO PeopleType VALUES (1, 'affiliates'), (2, 'customers'); 
+0

のものとすることができる。この方法をテーブルは顧客の場合は0、アフィリエイトの場合は1です。 –

+0

@ Fls'Zenは多かれ少なかれ同じです(例えば、 'enum'を使うこともできます)。どのように普通になりたいかによって決まります。 –

+0

基本的に、顧客とアフィリエイトを1つのテーブル(人)にまとめました。問題は、顧客と系列会社のフィールドが非常に異なるため、実際には私にとってはうまくいかないということです。 – user617123

0

以下を試すことができます。 顧客や関連会社のマスターになる新しいテーブルを作成します:

CREATE TABLE party 
( 
    id int not null auto_increment primary key , 
    party_type enum('customer','affiliate') not null, 
    email varchar(100), 
    UNIQUE (id,party_type) 
); 
--Then 
CREATE TABLE customer 
(
    .... 
    party_id INT NOT NULL, 
    party_type enum('customer') NOT NULL DEFAULT 'customer', 
    PRIMARY KEY (party_id,party_type) 
    FOREIGN KEY (party_id,party_type) REFERENCES party(id,party_type) 
); 
CREATE TABLE affiliates 
(
    .... 
    party_id INT NOT NULL, 
    party_type enum('affiliate') NOT NULL DEFAULT 'affiliate', 
    PRIMARY KEY (party_id,party_type) 
    FOREIGN KEY (party_id,party_type) REFERENCES party(id,party_type) 
) 
-- enum is used because mysql still doesn't have CHECK constraints 

各当事者が、それはかなりのように正規化されていないですが、あなたもの列を持つことができる唯一のタイプ