【问题标题】:ERROR 1452 : Cannot add or update a child row: a foreign key constraint fails错误 1452:无法添加或更新子行:外键约束失败
【发布时间】:2014-05-10 21:56:17
【问题描述】:

请帮帮我!

我遇到了这个错误。

Error: Cannot add or update a child row: a foreign key constraint fails (world.alarmes, CONSTRAINT fk_alarmes_registos1 FOREIGN KEY (idRegisto) REFERENCES registos (idRegisto) ON DELETE NO ACTION ON UPDATE NO ACTION)

我有这些表。

CREATE TABLE `registos` (
  `data_registo` char(10) NOT NULL,
  `hora_registo` time NOT NULL,
  `idSensor` varchar(8) NOT NULL,
  `Temperatura` char(6) DEFAULT NULL,
  `Humidade` char(6) DEFAULT NULL,
  `pt_orvalho` char(6) DEFAULT NULL,
  `idRegisto` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`idRegisto`,`idSensor`,`data_registo`,`hora_registo`),
  KEY `fk_registos_sensores1_idx` (`idSensor`),
  CONSTRAINT `fk_registos_sensores1` FOREIGN KEY (`idSensor`) REFERENCES `sensores` (`idSensor`) ON DELETE NO ACTION ON UPDATE NO ACTION
) 




CREATE TABLE `alarmes` (
  `idAlarme` int(11) NOT NULL AUTO_INCREMENT,
  `descricao_alarme` varchar(45) DEFAULT NULL,
  `data_criacao` datetime DEFAULT CURRENT_TIMESTAMP,
  `idRegisto` int(11) NOT NULL DEFAULT ''0'',
  PRIMARY KEY (`idAlarme`,`idRegisto`),
  KEY `fk_alarmes_registos1_idx` (`idRegisto`),
  CONSTRAINT `fk_alarmes_registos1` FOREIGN KEY (`idRegisto`) REFERENCES `registos` (`idRegisto`) ON DELETE NO ACTION ON UPDATE NO ACTION
) 

当我对表记录进行插入时,会弹出错误。

insert into registos values ('2014-03-31', '14:03:32', 'BrgTH032', '22.3', '45.3', '9.9', '32');

如果我这样做:

SET FOREIGN_KEY_CHECKS=0

下一个插入已经被接受,但是当我再次尝试时。返回同样的错误。

我一直在研究但失败了,因为 registos 表引用了 sensores 表中的外键。如果表中没有被引用的对应条目,则不能直接插入到关系表中。

但我不知道如何解决这个问题。

请帮帮我。

-------EDIT(我使用触发器填充表Alarmes)------------------------

DELIMITER $$
create TRIGGER alerta
BEFORE INSERT ON registos
FOR EACH ROW
begin
Set @tempmax=0;
Set @tempmin=0;


select lim_inf_temp, lim_sup_temp into @tempmin, @tempmax from sensores  where idSensor=NEW.idSensor;


Set @maxidAlarme=0;
if (CAST(NEW.Temperatura AS UNSIGNED)<@tempmin) then
SELECT MAX(idAlarme) into @maxidAlarme FROM alarmes;
SET @maxidAlarme=@maxidAlarme+1;
INSERT INTO alarmes(idAlarme,descricao_alarme, idRegisto) VALUES (@maxidAlarme,"temperatura inserida inferior ao normal",New.idRegisto);
end if; 


if (CAST(NEW.Temperatura AS UNSIGNED)>@tempmax) then
SELECT MAX(idAlarme) into @maxidAlarme FROM alarmes;
SET @maxidAlarme=@maxidAlarme+1;
INSERT INTO alarmes(idAlarme,descricao_alarme, idRegisto) VALUES (@maxidAlarme,"temperatura inserida superior ao normal",New.idRegisto);
end if; 

end $$;

DELIMITER  ;

【问题讨论】:

  • 传感器表中是否有一个 idSensor = 'BrgTH032' 的条目?
  • 感谢您的回复。是的,我愿意
  • 我应该做什么?
  • 'BrgTH032',检查 idSensor 为 'BrgTH032' 的 'Sensores' 表是否与字符完全匹配。特别是零而不是字母“O”。那个字母大小写完全匹配。此外,将列名放在插入查询中,因为值的顺序可能与表定义不完全匹配。
  • 感谢您的回复。 'BrgTH032' 的 idSensor 与表格传感器和表格寄存器中的字符完全匹配。在我看来与传感器表无关,但老实说我不知道​​为什么我不工作,我真的需要帮助。

标签: mysql sql mysql-error-1452


【解决方案1】:

您尝试向表中插入的值超出了允许的 7(七)但 6(六)的预期值。

始终在“插入”查询中包含您要插入的列。

此表中有七列,但其中一列是“自动递增”列,因此应该有6(六)个值插入查询。

CREATE TABLE `registos` (
  `data_registo` char(10) NOT NULL,
  `hora_registo` time NOT NULL,
  `idSensor` varchar(8) NOT NULL,
  `Temperatura` char(6) DEFAULT NULL,
  `Humidade` char(6) DEFAULT NULL,
  `pt_orvalho` char(6) DEFAULT NULL,
  `idRegisto` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`idRegisto`,`idSensor`,`data_registo`,`hora_registo`),
  KEY `fk_registos_sensores1_idx` (`idSensor`),
  CONSTRAINT `fk_registos_sensores1

这里是“插入”查询:

insert into registos values ('2014-03-31', '14:03:32', 'BrgTH032', '22.3', '45.3', '9.9', '32'); 

七个 值,但您希望查询看起来像(添加的列):

insert into registos (data_registo, hora_registo, idSensor, Temperatura, Humidade, pt_orvalho)
values ('2014-03-31', '14:03:32', 'BrgTH032', '22.3', '45.3', '9.9', '32');

我建议查询应该是:

insert into registos (data_registo, hora_registo, idSensor, Temperatura, Humidade, pt_orvalho)
values ('2014-03-31', '14:03:32', 'BrgTH032', '22.3', '45.3', '9.9');

“registos”上的触发器必须是插入后触发器才能获取新的“idRegisto”值。

create TRIGGER alerta
AFTER INSERT ON registos
FOR EACH ROW
begin

【讨论】:

  • 最后一个值是 idRegisto :S
  • idRegisto` int(11) NOT NULL AUTO_INCREMENT :表示将记录添加到数据库时会自动生成。您不得在查询中包含该内容。我将修改我的答案以显示查询应该是什么。
  • 感谢您的回复...我尝试不使用 idRegisto 并给我同样的错误:(
  • 我使用触发器来填充表格警报。是她向我开枪吗?
  • 啊,笨蛋,事情变得复杂了!现在禁用该触发器,让我们看看插入到 registos 是否有效!然后我们就可以开始整理触发器了。 ;-/ 而且,是的,故障很可能来自触发器。
猜你喜欢
  • 1970-01-01
  • 2015-02-04
  • 2013-06-11
  • 2019-03-29
  • 2018-05-14
  • 2013-05-11
  • 2013-09-28
  • 1970-01-01
  • 2014-01-06
相关资源
最近更新 更多