2010-12-21 105 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会阻止多个条目。