2017-04-03 106 views
0

我有以下各列的表名爲地址:郵政編碼/郵政編碼只屬於一個街道+城市

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

我想創建一個更新後檢查觸發器或插入只有一個城市+街道組合屬於一個郵政編碼。上表應該是可能的。此觸發後,下表中的示例應該不可用。因此,如果郵政編碼尚不存在,插入/更新必須繼續。如果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); 

這將確保有每個城市/街道組合只有一個郵政編碼(因爲ValidCityStreet中的主鍵)。那Address.PostalCode匹配它(因爲第二個外鍵引用)。

也就是說,您需要一個(簡單)觸發器將新值插入ValidCityStreet

說了這麼多,你可能會考慮將city/street對存儲在一個郵政編碼表中。然後更改地址表以引用該表中的一行,其中房屋號碼是Address中的單獨列。

我應該注意,在美國,一個完整的郵政編碼有9位數字。一個地址可以有多個郵政編碼。

+0

謝謝你的回答!但我真的必須像我在我的帖子中提到的那樣保留地球表,對我來說沒有其他選擇。 – user7432713

+0

@ user7432713。 。 。使用外鍵關係來確保單個郵政編碼。 –

相關問題