私は2つのテーブル、顧客および関連会社を持っています。 customers.emailとaffiliates.emailが排他的であることを確認する必要があります。言い換えれば、ある人は顧客でも、関係者でもない。これは基本的に外部キーの反対です。これを行う方法はありますか?mysqlの外部キーと反対側
答えて
あなたは電子メールを保存し、電子メールでのユニーク制約を持つテーブルを使用して、顧客や関連会社からそのテーブルを参照することができます。
(同じキーを参照する2つのレコードがないことを確認する必要があります)
挿入前と更新前にトリガーを使用して電子メールが存在しないかどうかを確認できます。
または、この検証はアプリケーションロジックに任せることができます。データベース内ではなく、アプリケーションコード内に置くことができます。
キーはありませんが、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、アフィリエイトの場合は1です。 –
@ Fls'Zenは多かれ少なかれ同じです(例えば、 'enum'を使うこともできます)。どのように普通になりたいかによって決まります。 –
基本的に、顧客とアフィリエイトを1つのテーブル(人)にまとめました。問題は、顧客と系列会社のフィールドが非常に異なるため、実際には私にとってはうまくいかないということです。 – user617123
以下を試すことができます。 顧客や関連会社のマスターになる新しいテーブルを作成します:
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
各当事者が、それはかなりのように正規化されていないですが、あなたもの列を持つことができる唯一のタイプ
- 1. 2レベルの多対1の関係でのmysql外部キー違反
- 2. mysql外部キー
- 3. 外部キーとMySQLエラー
- 4. mySQLの外部キー
- 5. エンティティフレームワークの1対多の挿入 - 外部キー違反
- 6. 外部キーのmysqlの
- 7. Mysqlデータベース間の外部キー
- 8. MySQLワークベンチの外部キー
- 9. MySQL非プライマリの外部キー
- 10. MySQLドロップフィールド。外部キーerrorno 150
- 11. MySQLは外部キーは
- 12. (MySQLの)主キーのw/2と同じ外部キー
- 13. sql IN()文の反対側
- 14. 反対側のネイティブビューに反応する
- 15. MySQLの複数列の外部キー?
- 16. MySQLの外部キー制約の混乱
- 17. MySQLの外部キーの参照
- 18. 主キーと外部キー?
- 19. 複合キーと外部キー
- 20. 主キーと外部キー
- 21. MySQLデータベース、複数の外部キー
- 22. トランザクションのmysql外部キー更新制約?
- 23. PHP MySQLの外部キー自動挿入
- 24. 多対1外部キー注釈マッピングを
- 25. Djangoと外部キー
- 26. MySQLCommandBuilderと外部キー
- 27. エンティティオブジェクトと外部キー
- 28. 外部キーとクラスタ
- 29. エンティティフレームワークと外部キー
- 30. レールと外部キー
あなたの最初の解決策は、customersテーブルとaffiliatesテーブルが両方とも電子メールのテーブル内の単一のレコードを参照しないようにしますか? – octern
はい、オクタンに同意します。しかし、あなたの答えの第二の部分は合法です。それをアプリケーションロジックに任せて(新しいレコードを挿入する前にチェックを実行するのが最も簡単な方法です)あなたの答えを編集すれば、私はそれを受け入れます。 – user617123
@ user617123メモを取って、回答を編集しました。 –