ОШИБКА 1452: Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено

Помоги мне, пожалуйста!

У меня эта ошибка.

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

следующая вставка уже принята, но при повторной попытке. назад, чтобы дать ту же ошибку.

Я проводил исследования и провалился, потому что таблица регистров ссылается на внешний ключ из таблицы сенсоров. Вы не можете напрямую вставить в реляционную таблицу без соответствующей записи в таблице, на которую ссылаются.

Но я не знаю, как решить это.

Помоги мне, пожалуйста.

------- РЕДАКТИРОВАТЬ (я использовал триггер для заполнения таблицы Алармы)------------------------

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  ;

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':

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
Другие вопросы по тегам