Ошибка 1452 Сбой внешнего ключа

Я получаю ошибку 1452 от MySQL. Вот SQL, который я использовал для INSERT

INSERT INTO `Quote` (`QTE_id`, `USR_id`, `QTE_total`, `QTE_desc`, `QTE_dateCreated`, `QTE_dateModified`,`QTE_name`, `QTE_status`)

ЗНАЧЕНИЯ (39, 2, NULL, 'описание', '2013-11-19 00:00:00', '2013-11-19 11:22:49', 'тест', 'Активно');

Cannot add or update a child row: a foreign key constraint fails (`dbNAME`.`Quote`, CONSTRAINT `USR_id1` FOREIGN KEY (`USR_id`) REFERENCES `users` (`USR_id`)) 

Я уверен, что USR_id, который я пытаюсь поместить в таблицу Quote, существует. Любые идеи? Многие другие вопросы о переполнении стека не ответили на мой вопрос.

Вот синтаксис Create для следующих таблиц, которые я пытаюсь вставить и связать (сгенерированные из Workbench):

CREATE TABLE `Quote` (
 `QTE_id` int(11) NOT NULL AUTO_INCREMENT,
  `USR_id` int(11) DEFAULT NULL,
  `QTE_total` decimal(7,2) DEFAULT NULL,
  `QTE_desc` text,
  `QTE_dateCreated` timestamp NULL DEFAULT NULL,
  `QTE_dateModified` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `QTE_name` varchar(255) DEFAULT NULL,
  `QTE_status` varchar(30) DEFAULT NULL,
   PRIMARY KEY (`QTE_id`),
   KEY `USR_id1` (`USR_id`),
   CONSTRAINT `USR_id1` FOREIGN KEY (`USR_id`) REFERENCES `users` (`USR_id`)
  ) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8;

И таблица пользователей:

CREATE TABLE `Users` (
 `USR_id` int(11) NOT NULL AUTO_INCREMENT,
  `MGR_id` int(11) NOT NULL DEFAULT '0' 
  `REP_id` int(11) NOT NULL,
  `USR_name` varchar(255) NOT NULL,
  `USR_login` varchar(255) NOT NULL,
  `USR_dateModified` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `USR_dateCreated` datetime NOT NULL,
  `USR_role` enum('Salesperson','Manager') DEFAULT NULL,
  PRIMARY KEY (`USR_id`,`MGR_id`,`REP_id`),
  KEY `MGR_id_idx` (`MGR_id`),
  KEY `REP_id_idx` (`REP_id`),
  KEY `USR_login` (`USR_login`),
  CONSTRAINT `MGR_id` FOREIGN KEY (`MGR_id`) REFERENCES `users` (`USR_id`) ON DELETE NO     ACTION ON UPDATE NO ACTION,
  CONSTRAINT `REP_id` FOREIGN KEY (`REP_id`) REFERENCES `representative` (`REP_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
 ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 

person Alex    schedule 19.11.2013    source источник


Ответы (1)


Мне пришлось внести несколько небольших изменений (изменить users на Users, добавить ',' в конце строки, определяющей MGR_id, удалить ограничение для REP_id), чтобы заставить работать два CREATE.

Вот точные CREATE:

CREATE TABLE `Users` (
 `USR_id` int(11) NOT NULL AUTO_INCREMENT,
  `MGR_id` int(11) NOT NULL DEFAULT '0',
  `REP_id` int(11) NOT NULL,
  `USR_name` varchar(255) NOT NULL,
  `USR_login` varchar(255) NOT NULL,
  `USR_dateModified` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `USR_dateCreated` datetime NOT NULL,
  `USR_role` enum('Salesperson','Manager') DEFAULT NULL,
  PRIMARY KEY (`USR_id`,`MGR_id`,`REP_id`),
  KEY `MGR_id_idx` (`MGR_id`),
  KEY `REP_id_idx` (`REP_id`),
  KEY `USR_login` (`USR_login`),
  CONSTRAINT `MGR_id` FOREIGN KEY (`MGR_id`) REFERENCES `Users` (`USR_id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
 ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;


CREATE TABLE `Quote` (
 `QTE_id` int(11) NOT NULL AUTO_INCREMENT,
  `USR_id` int(11) DEFAULT NULL,
  `QTE_total` decimal(7,2) DEFAULT NULL,
  `QTE_desc` text,
  `QTE_dateCreated` timestamp NULL DEFAULT NULL,
  `QTE_dateModified` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE     CURRENT_TIMESTAMP,
  `QTE_name` varchar(255) DEFAULT NULL,
  `QTE_status` varchar(30) DEFAULT NULL,
   PRIMARY KEY (`QTE_id`),
   KEY `USR_id1` (`USR_id`),
   CONSTRAINT `USR_id1` FOREIGN KEY (`USR_id`) REFERENCES `Users` (`USR_id`)
  ) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8;

При этом работали следующие два INSERT:

mysql> INSERT INTO `Users` (`USR_id`, `MGR_id`) VALUES(2, 2);
Query OK, 1 row affected, 4 warnings (0.22 sec)

mysql> INSERT INTO `Quote` (`QTE_id`, `USR_id`, `QTE_total`, `QTE_desc`, `QTE_dateCreated`, `QTE_dateModified`,`QTE_name`, `QTE_status`) VALUES (39, 2, NULL, 'desc', '2013-11-19 00:00:00', '2013-11-19 11:22:49', 'test', 'Active');
Query OK, 1 row affected (0.22 sec)

Надеюсь, это поможет.

person Razvan Musaloiu-E.    schedule 11.12.2013