2017-04-03 7 views
0

のみ属する:郵便番号/郵便番号は、私は、次の列を持つテーブルの名前ADDRESS持って1通り+都市

╔════════╦════════════╦═════════════╦════════════╗ 
║ City ║ Street ║ HouseNumber ║ PostalCode ║ 
╠════════╬════════════╬═════════════╬════════════╣ 
║  ║   ║    ║   ║ 
║ London ║ 1st street ║   5 ║  1234 ║ 
║ London ║ 1st street ║   6 ║  1234 ║ 
║ Stoke ║ 1st street ║   6 ║  1235 ║ 
║  ║   ║    ║   ║ 
╚════════╩════════════╩═════════════╩════════════╝ 

を私はアップデート後にチェックするトリガーを作成したり、唯一の都市+ことを挿入したいですストリートの組み合わせは1つの郵便番号に属します。上記の表は可能なはずです。以下の表の例は、このトリガーの後では使用できません。したがって、postalCodeがまだ存在しない場合は、挿入/更新を続行する必要があります。 postcalコードが終了した場合は、有効かどうかをチェックする必要があります。挿入/更新します。ロールバックしない場合はロールバックします。

私は本当にこのテーブルの構造を保つ必要があります。他のオプションは私にとっては不可能です。

╔════════╦═══════════════════╦═════════════╦════════════╗ 
║ City ║  Street  ║ HouseNumber ║ PostalCode ║ 
╠════════╬═══════════════════╬═════════════╬════════════╣ 
║ London ║ 1st street  ║   5 ║  1111 ║ 
║ London ║ 1st street  ║   6 ║  1111 ║ 
║ Stoke ║ 2nd street  ║   15 ║  1111 ║ 
║ London ║ 1st  street ║   5 ║  1115 ║ 
║  ║     ║    ║   ║ 
╚════════╩═══════════════════╩═════════════╩════════════╝ 

私はこの表が正常に正規化されていないことを知っています。気にしないでください。

+0

カナダの郵便番号についてお話ししていますか? –

+0

郵便番号、住所を入力するための複数の方法、潜在的な入力ミスは恐ろしい組み合わせです。 –

答えて

0

まず、ストリートコラムが標準化されていると仮定します。これは本当にこのタイプの作業に必要です。

トリガーを使用してこれを実行しません。私は別のテーブルを使ってこれを行います。 、そして、

create table ValidCityStreet (
    City varchar(255) not null, 
    Street varchar(255) not null, 
    PostalCode varchar(255), 
    primary key (City, Street), -- this ensures only one postal code 
    unique (City, Street, PostalCode) -- good for a foreign key reference 
); 

Addressに外部キー制約を追加します:厳密な検証の目的のために、あなたが定義することができ

alter table address add constraint fk_address_city_street 
    foreign key (city, street) references ValidCityStreet(city, street); 

alter table address add constraint fk_address_city_street_postalcode 
    foreign key (city, street) references ValidCityStreet(city, street, postalcode); 

これが原因で(市/ストリート組み合わせごとに1つだけ郵便番号が存在することを保証します主キーはValidCityStreetです)。そしてそれはAddress.PostalCodeと一致します(2番目の外部キー参照のため)。

つまり、新しい値をValidCityStreetに挿入するには(単純な)トリガーが必要です。

これまで述べてきたように、city/streetのペアを郵便番号付きのテーブルに格納することを検討することもできます。次に、アドレステーブルを変更してそのテーブルの行を参照し、ハウスナンバーを別の列にしてAddressにします。

米国では、完全な郵便番号は9桁であることに注意してください。 1つのアドレスに複数の郵便番号を付けることができます。

+0

あなたの答えをありがとう!しかし私は私のポストで言及したように、私は本当に追加テーブルを保持する必要があります、私のための他の選択肢はありません。 – user7432713

+0

@ user7432713 。 。単一の郵便番号を保証するために、外部キー関係を使用します。 –