1

我正在开发一个广泛使用数据库的 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 - 无法添加或更新子行:外键约束失败(`<database name>/sessions`, CONSTRAINT `fk_sessions_1` FOREIGN KEY (`patient_id`) REFERENCES `patient` (`id`) ON DELETE CASCADE ON更新级联)

我已经确认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;

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

4

2 回答 2

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;
于 2012-07-17T01:00:38.503 回答
0

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

您正在尝试插入一个sessons.patient_id不存在于patients.id. 这就是外键约束的设计方式。无论 LAST_UPDATE_ID() 的值是否符合您的预期,您都需要确认该值在patients.id.

例子:

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

如果您尝试将“3”插入sessions.patient_id,您将收到您看到的错误,id因为patients.

于 2012-07-16T23:40:25.427 回答