无法使用外键字段将行插入表中

时间:2012-07-16 23:00:18

标签: mysql foreign-keys innodb

我正在开发一个广泛使用数据库的PHP应用程序。我的同事设置数据库,设置表使用外键。这是我正在使用的声明:

INSERT INTO patients (ethnicity, gender)
VALUES (1, 1);

INSERT INTO sessions (patient_id, submitted, age_in_years, video, annotated)
VALUES (LAST_INSERT_ID(), NOW(), 0, '', FALSE);

第一个声明有效。但是,我在第二个语句中遇到以下错误。

#1452 - 无法添加或更新子行:外键约束失败(`<数据库名称> / sessions`,CONSTRAINT`fk_sessions_1` FOREIGN KEY(`patient_id`)参考`patient`(`id`) ON DELATE CASCADE ON UPDATE CASCADE)

我已确认LAST_INSERT_ID()会返回预期值。

我该如何解决这个问题?

以下是我们设置sessions

的方法
CREATE TABLE IF NOT EXISTS `sessions` (
  `id` int(11) NOT NULL auto_increment,
  `patient_id` int(11) NOT NULL,
  `severity` enum('Minimal Symptoms of Autism Spectrum Disorder','Mild-to-Moderate Symptoms of Autism Spectrum Disorder','Severe Symtoms of Autism Spectrum Disorder') default NULL,
  `submitted` datetime default NULL,
  `age_in_years` int(11) NOT NULL,
  `video` text NOT NULL,
  `annotated` tinyint(1) default '0',
  PRIMARY KEY  (`id`),
  KEY `fk_sessions_1` (`patient_id`),
  KEY `age_in_years` (`age_in_years`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

ALTER TABLE `sessions`
  ADD CONSTRAINT `fk_sessions_1` FOREIGN KEY (`patient_id`) REFERENCES `patient` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

编辑:删除了不必要的细节。如果您觉得自己需要更多,请随时查看这篇文章的第一个版本。

2 个答案:

答案 0 :(得分:1)

事实证明,当我的同事添加了外键时,外键引用的表名中有一个拼写错误。

ALTER TABLE `sessions`
  ADD CONSTRAINT `fk_sessions_1` FOREIGN KEY (`patient_id`) REFERENCES `patient` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

应该是

ALTER TABLE `sessions`
  ADD CONSTRAINT `fk_sessions_1` FOREIGN KEY (`patient_id`) REFERENCES `patients` (`id`) ON DELETE CASCADE;

答案 1 :(得分:0)

错误告诉你究竟出了什么问题。

您正试图在sessons.patient_id中插入patients.id中不存在的值。这就是外键约束如何通过设计工作。无论LAST_UPDATE_ID()的值是否符合您的预期,您都需要确认该值在patients.id中有效。

示例:

patients
---------------
id    |    name
---------------
1     |    john
2     |    jane

如果您尝试在sessions.patient_id中插入“3”,则会收到您看到的错误,因为id中不存在patients