Дублированные строки с уникальным индексом MySQL и NULL столбцы - PullRequest
0 голосов
/ 21 декабря 2010

Таблица Sufix: идентификатор, имя

(3, 'com')

Таблица DomainName: идентификатор, имя

(2, 'microsoft')

Домен таблицы: id, name_code, sufix

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

Таблица SubDomainName:

(4, 'windows')

Таблица SubDomain: id, name_code, домен

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

Таблица электронной почты: id, name, atserver

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

Вот проблема ограничений внешнего ключа. Как я могу разрешить домены и субдомены, чтобы правильно создавать электронные письма? У меня проблемы с Unique INDEX со значениями NULL, например, решение может быть:

Таблица электронной почты: идентификатор, имя, поддомен, домен

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

НО

(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 ]

2 голосов
/ 21 декабря 2010

Как насчет (5, 'newemail', domain_id / subdomain_id, 'domain / subdomain')

Так что вы могли бы

(5, «newemail», 7, «поддомен») или (5, «newemail», 1, «домен»)

Вы все еще можете оставить таблицу субдоменов и доменов «ВЛЕВО», но вы получите только те данные, которые вам нужны, на основании поля «домен / субдомен».

Это быстрое решение. ИМХО, ваша структура БД не очень хорошая и может быть оптимизирована. Вы должны хранить все записи о домене / поддомене в одной таблице и использовать их для электронных писем. Таблица должна быть Таблица FullDomain: идентификатор, имя_кода, имя_домена, имя_домена

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

или

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

2 голосов
/ 21 декабря 2010

Уникальный в MySQL проверяет, чтобы значения, отличные от NULL, были уникальными. Так что, если вам не нравится иметь более одной из этих строк:

(6, 'newemail', NULL, NULL)

Вы должны поместить уникальный индекс над этими двумя последними полями и поместить в них значения, отличные от NULL (т. Е. 0)

(6, 'newemail', 0, 0)

Тогда MySQL предотвратит множественные записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...