@selfowl

Связи в Mysql, как исправить ошибку 1215?

Есть 2 таблицы, пытаюсь добавить связь от product->photo_id к photos->product_id
На выходе получаю #1215 - Невозможно добавить ограничения внешнего ключа

CREATE TABLE `product` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `price` int(11) NOT NULL,
 `discount` int(11) NOT NULL,
 `unit_discount` varchar(255) NOT NULL,
 `sku` varchar(255) NOT NULL,
 `promocode` int(11) NOT NULL,
 `name` varchar(255) NOT NULL,
 `description` text NOT NULL,
 `photo_id` int(11) DEFAULT NULL,
 `weight` int(11) NOT NULL,
 `unit` varchar(255) NOT NULL,
 `property` json NOT NULL,
 `date_create` datetime NOT NULL,
 `restaurant_id` int(11) NOT NULL,
 `creator_id` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `key_sync_product_to_rest` (`restaurant_id`),
 KEY `key_sync_product_to_promo` (`promocode`),
 CONSTRAINT `key_sync_product_to_promo` FOREIGN KEY (`promocode`) REFERENCES `promocodes` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `key_sync_product_to_rest` FOREIGN KEY (`restaurant_id`) REFERENCES `restaurants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8


CREATE TABLE `photos` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `product_id` int(11) DEFAULT NULL,
 `user_id` int(11) NOT NULL,
 `name` varchar(255) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `key_sync_p_to_u` (`user_id`),
 CONSTRAINT `key_sync_p_to_u` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8


ALTER TABLE `product`
  ADD CONSTRAINT `geidicsbbdfdb` FOREIGN KEY (`photo_id`) REFERENCES `photos` (`product_id`) ON DELETE CASCADE ON UPDATE CASCADE
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
К самим скриптам есть только одна претензия - в таблице photos отсутствует индекс по product_id, который необходим для создания внешнего ключа. После исправления этого косяка запрос на создание FOREIGN KEY выполняется без проблем.

FIDDLE

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

=========================

Но это с формальной стороны. А вот логика - она лежит в глубоком ауте. И не понимает, почему идентификатор фотографии должен быть равен идентификатору продукта.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Проверьте, что среди значений `product`.`photo_id` нет таких, которые отсутствуют среди значений `photos`.`product_id`
Непонятен, правда, смысл такой связи. Название `photo_id` намекает на то, что она должна быть связана с `photos`.`id`, а `product_id`, соответственно, с `product`.`id`. У вас же какая-то странная связь.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы