具有UNIQUE INDEX MySQL和NULL列的重复行

时间:2010-12-21 09:51:52

标签: php mysql database email dns

表格修正: id,name

(3, 'com')

表DomainName: id,name

(2, 'microsoft')

表域: id,name_code,sufix

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

表SubDomainName:

(4, 'windows')

表子域名: id,name_code,domain

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

表格电邮: id,name,atserver

(3, 'myemail', 7)    -- myemail@windows.microsoft.com
(4, 'other', 1)      -- other@microsoft.com

这是外键约束的问题。如何解析域和子域以正确创建电子邮件?我遇到了带有NULL值的Unique INDEX问题,例如,解决方案可能是:

表格电邮: ID,域名,子域名,域名

(3, 'myemail', 7, NULL)  -- myemail@windows.microsoft.com
(4, 'other', NULL, 1)    -- other@microsoft.com

BUT

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

(**3**, 'myemail', 7, 1)   -- myemail@windows.microsoft.com and myemail@microsoft.com

2 个答案:

答案 0 :(得分:2)

MySQL中的唯一功能只检查非NULL值是否唯一。 所以,如果你不喜欢有一个以上的系列:

(6, 'newemail', NULL, NULL)

您必须在theese最后两个字段上放置一个唯一索引,并在其中放置除NULL之外的值(即0)

(6, 'newemail', 0, 0)

然后MySQL将阻止多个条目。

答案 1 :(得分:2)

如何(5,'newemail',domain_id / subdomain_id,'domain / subdomain')

所以你可以拥有

(5,'newemail',7,'subdomain')或(5,'newemail',1,'domain')

你仍然可以LEFT JOIN SubDomain和Domain表,但是你只能根据'domain / subdomain'字段获得你需要的数据。

这是快速解决方案。恕我直言你的数据库结构不是很好,可以优化。您应该将所有域/子域记录保存在一个表中,并将其用于电子邮件。该表应为Table FullDomain:id,name_code,domain_name,subdomain_name

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

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