@Forge0100

Почему не хочешь создаватся таблица?

CREATE TABLE IF NOT EXISTS `offers_representative` (
  `offers_representative_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `customers_id` INT NOT NULL,
  `products_id` INT NOT NULL,
  `products_price` DECIMAL( 14, 6 ) NOT NULL,
  FOREIGN KEY(customers_id) REFERENCES customers(customers_id),
  FOREIGN KEY(products_id) REFERENCES products(products_id)
) ENGINE=InnoDB;


Ошибка

#1005 - Can't create table 'project.offers_representative' (errno: 150)


Эта проблема связана с `FOREIGN KEY`, но как тогда правильно их записать?
  • Вопрос задан
  • 141 просмотр
Пригласить эксперта
Ответы на вопрос 2
@karminski
Senior React.JS Developer
CREATE TABLE IF NOT EXISTS `offers_representative` (
  `offers_representative_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `customers_id` INT NOT NULL,
  `products_id` INT NOT NULL,
  `products_price` DECIMAL( 14, 6 ) NOT NULL,
  CONSTRAINT `offers_representative_ibfk_1` FOREIGN KEY(`customers_id`) REFERENCES `customers` (`customers_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `offers_representative_ibfk_2` FOREIGN KEY(`products_id`) REFERENCES `products` (`products_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;


При этом таблицы `customers` и `products` должны быть созданы до создания этой таблицы. Ключи `customers_id` и `products_id` тоже должны быть заданы. Вместо `CASCADE` могут быть `RESTRICT` или `SET NULL`.

Кстати возможно вы перепутали с `REFERENCES `customers` (`customers_id`)`. Может быть вы хотели указать так: REFERENCES `customers` (`id`). Т.е. в REFERENCES должна быть указана таблица, на которую вы ссылаетесь, и ее первичный ключ (колонка).
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
Детали, почему не удалось повесить внешний ключ можно найти в "логичном и очевидном" месте: в выводе команды SHOW ENGINE INNODB STATUS, есть кусочек текста LATEST FOREIGN KEY ERROR.

Частые ошибки - в одной таблице поле int, в другой unsigned int. Это разные, несовместимые типы, ага.
Ответ написан
Ваш ответ на вопрос

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

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