2011-03-02 8 views
0

私はasp.netでSQL Server2005を使用しています。私はここで私は2つのテーブル会社と支店を使用している重複したエントリを制限するためにサーバー側で検証をしたい。ブランチテーブルでは、CompanyIdの外部キーを維持していました。支店では支店名は重複することができますが、特定のCompanyIdでは使用できません。同じ外部キー参照ではなく、テーブルに重複値を許可するクエリ

Companies Table: 
     Columns: CompanyId (Primary Key), CompanyName 

Branches Table : 
     Columns: BranchId(Primary Key), BranchName, CompanyId (Foreign Key). 

企業IDは複数回、1対多のリレーションシップを繰り返すことができます。 同じCompanyIdではなく、重複を許可するクエリはどちらですか?

答えて

2

BranchName + CompanyIdからcomposite primary keyを作成することができます。

http://weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx

+0

ああ私にそれを打つ:) +1 –

+0

会社IDは複数回繰り返すことができます。 – Ritu

+0

@ Ritu:はい、あなたの問題は...? Damiensのソリューションは、独自のcontsraintや複合主キーを持つ私のソリューションで使用できます。どちらも重複を回避します(同じCompanyIDの同じBranchName)。あなたの質問は、どのように特定の組み合わせが既にデータベースに存在するかを照会する方法です。あなたはそれを挿入しようとするか、または最も単純な方法である制約の例外をキャッチするか、挿入の前にテーブルを調べる(遅い)クエリを書くことができます。 –

4

あなたは、両方の企業IDとBranchName列に対して一意性を強制制約をしたいです。これは、テーブルの主キー(ティムが推奨しているように)、またはUNIQUE制約によって次のいずれかです。

ALTER TABLE Branches ADD 
    CONSTRAINT UQ_BranchNamesWithinCompanies UNIQUE (BranchName,CompanyID); 

あなたは検索がで実行される頻度に基づいて、制約内の列を置くためにどの順番を決めることができますテーブルは2つの列に基づいています。私。実際にこれらの列に索引を作成しているので、それを使用していくつかの照会のパフォーマンスを向上させることもできます。

上記の注文は、特定の会社を参照せずに支店名を検索する可能性があると想定しています。会社内で常に検索していてプレフィックス検索(例:CompanyID=21 and BranchName like 'Lon%')を行っている場合は、列の順序を逆にする必要があります。

関連する問題