2010-06-13 3 views
1

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

 
CREATE TABLE IF NOT EXISTS `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', 
    PRIMARY KEY (`id`,`email`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

А вот мой contact_info стол

 
CREATE TABLE IF NOT EXISTS `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, 
    PRIMARY KEY (`id`,`email_address`), 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

Система использует имя пользователя для входа пользователей. Я хочу изменить его таким образом, чтобы он использовал электронную почту для входа. Но в таблице users нет адреса электронной почты.

Я добавил внешний ключ - адрес электронной почты в таблице пользователя (который является адресом email_address в contact_info).

Как я могу запросить базу данных?

+0

Вы действительно хотите иметь два адреса электронной почты для каждого пользователя? Или это соотношение между двумя таблицами? – 2ndkauboy

ответ

10

Нет, нет, нет, нет нет. Серьезно, нет. Не заставляйте меня приходить туда и шлепнуть вас :-)

Вы нарушаете третью нормальную форму, дважды сохраняя адрес электронной почты.

Отношения должны быть короткими, а не id. Предполагая, что вы не гарантируете, что идентификаторы будут идентичными в двух таблицах (т. Е. Мой users.id не обязательно равен моему contact_info.id), просто добавьте ci_id в таблицу users, чтобы действовать как внешний ключ в таблице contact_info.

Тогда запрос для получения пользователя username и email будет что-то вроде:


select u.username, ci.email 
from users u, contact_info ci 
where u.username = 'paxdiablo' 
and u.ci_id = ci.id; 

Кстати, это не обязательно сообщества вики подобные вопросы. Они отлично подходят здесь, на SO, и вы, вероятно, получите больше ответов, если они будут задействованы. Недостаток репутации не остановит меня, конечно, я здесь, потому что мне нравится рассказывать людям, что делать, и это довольно сложно в домашнем хозяйстве с волевой женой и двумя детьми в возрасте до шести лет :-)

+0

Спасибо за ответ. На самом деле, я не знал, что это было. Так что просто подумал о том, чтобы отметить ящик, который я впервые заметил в StackOverflow :-) – kapeels

+0

@KPL: «Хм, я не знаю, что делает эта кнопка, я просто нажму и посмотрю». Я бы хотел, чтобы вы были одним из моих тестеров, а не одним из моих пользователей :-) – paxdiablo

Смежные вопросы