Составной ключ как внешний ключ (sql) - PullRequest
20 голосов
/ 20 марта 2012

вот две мои проблемы:

CREATE TABLE IF NOT EXISTS `tutorial` (
  `beggingTime` time NOT NULL,
  `day` varchar(8) NOT NULL,
  `tutorId` int(3) NOT NULL,
  `maxMembers` int(2) NOT NULL,
  `minMembers` int(1) NOT NULL,
  PRIMARY KEY (`beggingTime`,`day`,`tutorId`),
  KEY `tutorId` (`tutorId`)
) 


CREATE TABLE IF NOT EXISTS `group` (
  `groupId` tinyint(3) NOT NULL AUTO_INCREMENT,
  `status` varchar(20) NOT NULL,
  `groupName` varchar(50) NOT NULL,
  PRIMARY KEY (`groupId`)
) 

Я хотел бы создать поле в 'group', которое связывалось бы с составными уникальными ключами в 'tutorial'.Итак, я думаю, мой вопрос, как мне связать эти таблицы?мне нужно создать поле внешних ключей в «group» для каждого первичного ключа в «tutorial»?

Ответы [ 2 ]

23 голосов
/ 20 марта 2012

Согласно документации mySQL вы сможете настроить сопоставление внешнего ключа для композитов, что потребует от вас создания нескольких столбцов.

Добавьте столбцы и поместите это в group таблицу

FOREIGN KEY (`beggingTime`,`day`,`tutorId`) 
    REFERENCES tutorial(`beggingTime`,`day`,`tutorId`)

Как упомянул Стивен в комментариях ниже, вы ДОЛЖНЫ попытаться перестроить это так, чтобы в учебной таблице использовался фактический первичный ключ (даже если это просто идентификационный суррогатный ключ). Это позволит повысить производительность, так как SQL был создан для этого типа отношений, а не составных.

1 голос
/ 20 марта 2012

1] переписать первую таблицу: поставив сначала tutorId, он автоматически становится ключом сам по себе.Фактически, все, кроме последнего из составных столбцов, становятся ключевыми.

CREATE TABLE IF NOT EXISTS `tutorial` (
 `beggingTime` time NOT NULL,
 `day` varchar(8) NOT NULL,
 `tutorId` int(3) NOT NULL,
 `maxMembers` int(2) NOT NULL,
 `minMembers` int(1) NOT NULL,
 PRIMARY KEY mykey (`tutorId`,`beggingTime`,`day`)
) 

2] Наличие большого количества индексов очень дорого для таблиц с тяжелой записью.Поэтому рассмотрим дополнительное поле в учебнике для использования в качестве внешнего ключа;возможно auto_increment record_id.Подумай об этом.

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