Вот моя таблица USER
CREATE TABLE, ЕСЛИ НЕ СУЩЕСТВУЕТ `users` ( `id` int (11) NOT NULL AUTO_INCREMENT, `username` varchar (100) NOT NULL, `expiry` varchar (6) NOT NULL, `contact_id` int (11) NOT NULL, `email` varchar (255) NOT NULL, `password` varchar (100) NOT NULL, `level` int (3) NOT NULL, `active` tinyint (4) NOT NULL DEFAULT '1', ПЕРВИЧНЫЙ КЛЮЧ (`id`,` email`) ) ENGINE = InnoDB DEFAULT CHARSET = latin1 AUTO_INCREMENT = 1;
И вот моя таблица contact_info
CREATE TABLE, ЕСЛИ НЕ СУЩЕСТВУЕТ `contact_info` ( `id` int (11) NOT NULL AUTO_INCREMENT, `name` varchar (255) NOT NULL, `email_address` varchar (255) NOT NULL, `company_name` varchar (255) NOT NULL, `license_number` varchar (255) NOT NULL, `phone` varchar (30) NOT NULL, `fax` varchar (30) NOT NULL, `mobile` varchar (30) NOT NULL, `category` varchar (100) NOT NULL, `country` varchar (20) NOT NULL, `state` varchar (20) NOT NULL, `city` varchar (100) NOT NULL, `postcode` varchar (50) NOT NULL, ПЕРВИЧНЫЙ КЛЮЧ (`id`,` email_address`) ) ENGINE = InnoDB DEFAULT CHARSET = latin1 AUTO_INCREMENT = 1;
Система использует имя пользователя для входа в систему. Я хочу изменить его таким образом, чтобы он использовал электронную почту для входа. Но в таблице users нет адреса электронной почты.
Я добавил внешний ключ – адрес электронной почты в таблице пользователя (который является адресом email_address в contact_info).
Как я должен запрашивать базу данных?
Нет-нет-нет-нет-нет. Серьезно, нет. Не заставляй меня приходить туда и шлепнуть тебя 🙂
Вы нарушаете третью нормальную форму, дважды сохраняя адрес электронной почты.
Отношения должны быть только короткими, а именно id
. Предполагая, что вы не гарантируете, что идентификаторы будут одинаковыми в двух таблицах (т. users.id
Мой users.id
не обязательно равен моему contact_info.id
), просто добавьте ci_id
в таблицу users
чтобы действовать как внешний ключ для contact_info
.
Тогда запрос на получение username
и email
username
будет выглядеть примерно так:
select u.username, ci.email from users u, contact_info ci where u.username = 'paxdiablo' and u.ci_id = ci.id;
Кстати, это не обязательно для таких вопросов, как Community-Wiki. Они отлично подходят здесь, на SO, и вы, вероятно, получите больше ответов, если они будут задействованы. Недостаток репутации не остановит меня, конечно, я здесь, потому что мне нравится рассказывать людям, что делать, и это довольно сложно в домашнем хозяйстве с волевой женой и двумя детьми в возрасте до шести лет 🙂