我正在开发一个广泛使用数据库的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;
编辑:删除了不必要的细节。如果您觉得自己需要更多,请随时查看这篇文章的第一个版本。
答案 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
。