Внешние ключи с MySQL - PullRequest
       21

Внешние ключи с MySQL

0 голосов
/ 01 августа 2011

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

Вот таблица:

CREATE TABLE IF NOT EXISTS `resa_product` (
  `id_reservation` int(10) NOT NULL,
  `id_business` int(10) NOT NULL,
  `id_category` int(10) NOT NULL,
  `id_product` int(10) NOT NULL,
  `quantity` int(11) NOT NULL,
  PRIMARY KEY (`id_reservation`,`id_business`,`id_category`,`id_product`),
  KEY `resa_prod_index` (`id_business`,`id_category`,`id_product`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Таблица продуктов:

CREATE TABLE IF NOT EXISTS `product` (
  `id_business` int(10) NOT NULL,
  `id_product` int(10) NOT NULL AUTO_INCREMENT,
  `id_category` int(10) NOT NULL,
  `nom` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
 ...
  PRIMARY KEY (`id_product`,`id_category`,`id_business`),
  KEY `id_category` (`id_category`),
  KEY `id_business` (`id_business`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ;

но когда я пытаюсь это сделать, я получаю errno 150 от mySQL:

ALTER TABLE `resa_product`
ADD FOREIGN KEY (`id_business`, `id_category`, `id_product`)
REFERENCES `product`(`id_business, `id_category`, `id_product`)
ON UPDATE CASCADE
ON DELETE RESTRICT;

Я не понимаю, почему я не могу вставить этот составной ключ, хотя я добавил индекс. У кого-нибудь есть идея?

спасибо за вашу помощь

Ответы [ 2 ]

1 голос
/ 01 августа 2011

В таблице продуктов

  • тип данных и сопоставление 3 столбцов должны совпадать
  • должно быть уникальное ограничение или индекс для 3 столбцов в том же порядке, что и для FK

Редактировать: после обновления вопроса.

Измените внешний ключ на этот, чтобы выровнять порядок столбцов по PK продукта

ALTER TABLE `resa_product`
ADD FOREIGN KEY (`id_product`, `id_category`, `id_business`)
REFERENCES `product`(`id_product, `id_category`, `id_business`)
ON UPDATE CASCADE
ON DELETE RESTRICT;

Тем не менее, 3 столбца появляются в разных порядках по всему шоу. Я бы исправил это, чтобы быть последовательным лично ...

1 голос
/ 01 августа 2011

Наиболее распространенная причина этой проблемы - небольшая разница между столбцами в products и resa_product.Типы полей должны быть одинаковыми, поэтому размер / точность и знак (без знака или без) должны совпадать.

...