2010-12-21 50 views
0

表Sufix: ID,名稱重複的行具有唯一索引MySQL和NULL列

(3, 'com') 

表域名: ID,名稱

(2, 'microsoft') 

表域名: ID ,name_code,sufix

(1, 2, 3) -- microsoft.com 

表SUBDOMAINNAME:

(4, 'windows') 

表子域: ID,name_code,域

(7, 4, 1)  -- windows.microsoft.com 

表電子郵件: ID,姓名,atserver

(3, 'myemail', 7) -- [email protected] 
(4, 'other', 1)  -- [email protected] 

這是一個外鍵約束問題。如何解決域名和子域名以正確創建電子郵件?我遇到的問題具有唯一索引與NULL值,例如,可能的解決方案:

表電子郵件: ID,名稱,子域,域

(3, 'myemail', 7, NULL) -- [email protected] 
(4, 'other', NULL, 1) -- [email protected] 

(5, 'newemail', NULL, NULL) -- will duplicated values in the table 
(6, 'newemail', NULL, NULL) 
(7, 'newemail', NULL, NULL) 
(8, 'newemail', NULL, NULL) 

AND

(**3**, 'myemail', 7, 1) -- [email protected] and [email protected] 

回答

2

怎麼樣(5 'NEWEMAIL',域ID/subdomain_id, '站點/子')

所以你可以有

(5 'NEWEMAIL',7, '子域')或( 5,'newemail',1,'domain')

YOu仍然可以左連接子域和域表,但你只會根據'域/子域'字段獲得你需要的數據。

這是快速解決方案。恕我直言,你的數據庫結構不是很好,可以優化。您應該將所有域/子域記錄保存在一個表中,並將其用於電子郵件。該表應該是表FullDomain:ID,name_code,DOMAIN_NAME,subdomain_name

(1, 3, 2, 4) -- windows.microsoft.com

(1, 3, 2, 0) -- microsoft.com

+0

沒有與約束的問題嗎?我無法在domain_id/subdomain_id列中設置「僅來自SUBDOMAINS和DOMAINS的值」約束。 – 2010-12-21 14:41:43

+0

然後使用第二個選項。 – 2010-12-22 10:55:34

2

Unique in My SQL只檢查非空值是唯一的。 所以,如果你不喜歡有theese行不止一個:

(6, 'newemail', NULL, NULL) 

你必須把獨特的指數超過theese最後兩個字段,並把非NULL值(即0),在他們

(6, 'newemail', 0, 0) 

然後MySQL會阻止多個條目。

相關問題