Mysql - Trigger

4 respostas
I
Tenho a seguinte Trigger:
DELIMITER ||

DROP TRIGGER IF EXISTS trigInsereRemedios ||
CREATE TRIGGER trigInsereRemedios AFTER INSERT ON remedios
	FOR EACH ROW BEGIN
		DECLARE aux_tipo varchar(100);
		IF(NEW.tipo IS NULL)THEN
			SET aux_tipo = 'Não Especificado';
		ELSE
			SET aux_tipo = NEW.tipo;
		END IF;

		INSERT INTO Auditoria (antiga, nova, tipo, tabela, data) VALUES (
			'Não Possui',
			CONCAT('id',NEW.id,'nome',NEW.nome,'tipo',aux_tipo,'quantidade',NEW.quantidade,'id_fornecedor',NEW.id_fornecedor,'valor',NEW.valor),
			'INSERT',
			'Remedios',
			NOW()
		);
	END;
||

DELIMITER ;
Ela cria normalmente
Query OK, 0 rows affected (0.05 sec)
Mas quando executo algum INSERT:
insert into Remedios (nome,tipo,quantidade,id_fornecedor,valor) values ('Diazepam','Ansiolíticos',150,2,35);
Ela me retorna um erro, a meu ver parece ser que ela não me deixa usar a FK:
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`clinica`.`remedios`, CONSTRAINT `remedios_ibfk_1` FOREIGN KEY (`id_fornecedor`) REFERENCES `fornecedor` (`id`))
Gostaria de saber como resolver isso. Outras infos:
create table Fornecedor(
	id int primary key auto_increment not null,
	nome_empresa varchar(100) not null,
	cnpj varchar(20) not null unique,
	fone varchar(20) not null,
	status int not null,
	endereco varchar(200)
);

create table Remedios(
	id int auto_increment not null,
	nome varchar(100) not null,
	tipo varchar(100),
	quantidade int not null,
	id_fornecedor int not null,
	valor double not null,
	foreign key (id_fornecedor) references Fornecedor(id),
	primary key (id,id_fornecedor)
);

4 Respostas

L
1. ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`clinica`.`remedios`, CONSTRAINT `remedios_ibfk_1` FOREIGN KEY (`id_fornecedor`) REFERENCES `fornecedor` (`id`))

existem algumas possibilidades que pensei aqui:
1- duplicidade de dados - já existe no banco de dados uma chave estrangeira com o valor inserido. Significa que vc criou a tabela para não aceitar repeticao de um valor neste campo.
2- o valor do id que está tentando inserir não eixste na tabela fornecedor

é o que estou pensando no momento.

Mostra como criou a tabela Auditoria

I
ta ai
CREATE TABLE Auditoria(
	id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
	data DATE NOT NULL,
	tipo VARCHAR(100) NOT NULL,
	tabela VARCHAR(100) NOT NULL,
	antiga VARCHAR(700) NOT NULL,
	nova VARCHAR(700) NOT NULL	
);
testei com a trigger do fornecedor, e n deu nenhum problem (ela n tem FK)
DROP TRIGGER IF EXISTS trigInsereFornecedor ||
CREATE TRIGGER trigInsereFornecedor AFTER INSERT ON Fornecedor
	FOR EACH ROW BEGIN
		DECLARE aux_endereco varchar(200);
		DECLARE aux_status varchar(20);

		IF (NEW.endereco IS NULL) THEN
			SET aux_endereco = 'Não inserido';
		ELSE
			SET aux_endereco = NEW.endereco;
		END IF;	

		IF (NEW.status = 1) THEN
			SET aux_status = 'Ativo';
		ELSE
			SET aux_status = 'Inativo';
		END IF;

		INSERT INTO Auditoria (antiga, nova, tipo, tabela, data) VALUES (
			'Não Possui',
			concat('ID: ',NEW.id,' - Empresa: ',NEW.nome_empresa,' - CNPJ: ',NEW.cnpj,' - Fone: ',NEW.fone,' - Status: ',aux_status,' - Endereco: ',aux_endereco),
			'INSERT',
			'Fornecedor',
			NOW()
		);
	END;
||

DELIMITER ;
insere fornecedor:
insert into Fornecedor (nome_empresa,cnpj,fone,status)values ('Nenhum','0','0',0);
insert into Fornecedor (nome_empresa,cnpj,fone,status)values ('Biolab','00.000.000/0000-00','([telefone removido]',1);
insert into Fornecedor (nome_empresa,cnpj,fone,status)values ('Merck','00.000.000/0000-01','([telefone removido]',1);
insert into Fornecedor (nome_empresa,cnpj,fone,status)values ('Stryker','00.000.000/0000-02','([telefone removido]',1);
insert into Fornecedor (nome_empresa,cnpj,fone,status)values ('Alere','00.000.000/0000-03','([telefone removido]',1);
insert into Fornecedor (nome_empresa,cnpj,fone,status)values ('White Martins','00.000.000/0000-04','([telefone removido]',1);
insert into Fornecedor (nome_empresa,cnpj,fone,status)values ('Cristália','00.000.000/0000-05','([telefone removido]',1);
a auditoria ficou assim:
select * from auditoria;
+----+------------+--------+------------+------------+--------------------------------------------------------------------------------------------------------------------------+
| id | data       | tipo   | tabela     | antiga     | nova
+----+------------+--------+------------+------------+--------------------------------------------------------------------------------------------------------------------------+
|  1 | 2011-12-01 | INSERT | Fornecedor | Não Possui | ID: 1 - Empresa: Nenhum - CNPJ: 0 - Fone: 0 - Status: Inativo - Endereco: Não inserido
|  2 | 2011-12-01 | INSERT | Fornecedor | Não Possui | ID: 2 - Empresa: Biolab - CNPJ: 00.000.000/0000-00 - Fone: ([telefone removido] - Status: Ativo - Endereco: Não inserido
|  3 | 2011-12-01 | INSERT | Fornecedor | Não Possui | ID: 3 - Empresa: Merck - CNPJ: 00.000.000/0000-01 - Fone: ([telefone removido] - Status: Ativo - Endereco: Não inserido
|  4 | 2011-12-01 | INSERT | Fornecedor | Não Possui | ID: 4 - Empresa: Stryker - CNPJ: 00.000.000/0000-02 - Fone: ([telefone removido] - Status: Ativo - Endereco: Não inserido
|  5 | 2011-12-01 | INSERT | Fornecedor | Não Possui | ID: 5 - Empresa: Alere - CNPJ: 00.000.000/0000-03 - Fone: ([telefone removido] - Status: Ativo - Endereco: Não inserido
|  6 | 2011-12-01 | INSERT | Fornecedor | Não Possui | ID: 6 - Empresa: White Martins - CNPJ: 00.000.000/0000-04 - Fone: ([telefone removido] - Status: Ativo - Endereco: Não inserido
|  7 | 2011-12-01 | INSERT | Fornecedor | Não Possui | ID: 7 - Empresa: Cristália - CNPJ: 00.000.000/0000-05 - Fone: ([telefone removido] - Status: Ativo - Endereco: Não inserido
+----+------------+--------+------------+------------+--------------------------------------------------------------------------------------------------------------------------+
7 rows in set (0.00 sec)
L

Será que não é por que tá faltando o Engine?
Qual é a Engine que vc tá utilizando para as tabelas?

create table Fornecedor(
	id int primary key auto_increment not null,
	nome_empresa varchar(100) not null,
	cnpj varchar(20) not null unique,
	fone varchar(20) not null,
	status int not null,
	endereco varchar(200)
) ENGINE=INNODB;

create table Remedios(
	id int auto_increment not null,
	nome varchar(100) not null,
	tipo varchar(100),
	quantidade int not null,
	id_fornecedor int not null,
	valor double not null,
	foreign key (id_fornecedor) references Fornecedor(id),
	primary key (id,id_fornecedor)
) ENGINE=INNODB;

???

I

não é, ja testei este msm modelo de auditoria com triggers de outros bancos e tals, só q em outros bancos (ambiente de teste) nao havia FK, nesse outro, q coloquei FK ele nao me deixa manipula-las

@edit
consegui, dentro da trigger eu criei algumas variaveis auxiliares na e com elas fiz alguns IFs para fazer a validação dos dados antes de executar o comando de insert na tabela auditoria, funcionou e nao esta mais dando erro,

Criado 1 de dezembro de 2011
Ultima resposta 1 de dez. de 2011
Respostas 4
Participantes 2