Компонентный ключ как внешний ключ (sql)

вот мои две таблицы, вызывающие озабоченность:

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`) ) 

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

2 Solutions collect form web for “Компонентный ключ как внешний ключ (sql)”

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

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

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

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

1] tutorId первую таблицу: сначала поставив 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. Дайте ему несколько мыслей.

  • Ошибка удаления базы данных (не может rmdir '.test \', errno: 17)
  • Совместное использование листа Excel через сеть?
  • Есть ли ярлык для SELECT * FROM?
  • Выберите строки, соответствующие всем элементам списка.
  • получить строку с разделителями-запятыми из строк
  • Удалить повторяющиеся записи в PostgreSQL
  • Как отправить несколько полей данных через Ajax?
  • Соединение CodeIgniter MSSQL
  • выбор уникальных значений из столбца
  • Объединение 2 SQL-запросов и получение результата в одном
  • Как создать временную таблицу в базе данных Oracle?
  • Давайте будем гением компьютера.