Невозможно связать две таблицы MySQL (внешние ключи)

Вот моя таблица 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, и вы, вероятно, получите больше ответов, если они будут задействованы. Недостаток репутации не остановит меня, конечно, я здесь, потому что мне нравится рассказывать людям, что делать, и это довольно сложно в домашнем хозяйстве с волевой женой и двумя детьми в возрасте до шести лет 🙂