Ir para conteúdo
Fórum Script Brasil

Denis Courcy

Moderadores
  • Total de itens

    3.089
  • Registro em

  • Última visita

Tudo que Denis Courcy postou

  1. Este não é um erro do MySQL. Transferindo para o forum de PHP.
  2. Minha opinião é que os dados sejam validados no model, sempre. Pois concordo com a tese de que apenas o model sabe como seus dados se comportam e, se você descreve seus campos de dados no model, você deve descrever as regras de validação para estes campos no mesmo lugar.
  3. Tente assim: select quantidade INTO @qtd from vendas_produto where vendas_produto.codigo_venda = OLD.codigo; select select distinct codigo_produto INTO @codProd from vendas_produto where vendas_produto.codigo_venda = OLD.codigo; update produtos set produtos.estoque = produtos.estoque + @qtd where produtos.codigo=@codprod; Informe onde está ocorrendo o erro de multiplicidade de registros.
  4. Para forçar um erro em um trigger basta atribuir NULL a um campo NOT NULL. Segue abaixo um exemplo de como eu executo CUD(Create, Update, Delete) /* Criação tabela exemplo */ CREATE TABLE exemplo( idExemplo INT UNSIGNED NOT NULL AUTO_INCREMENT, dsExemplo VARCHAR(50) NOT NULL, PRIMARY KEY (idExemplo) )ENGINE InnoDB; DELIMITER $$; DROP PROCEDURE IF EXISTS `meuBancoDeDados`.`exemploCUD`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `exemploCUD`(IN Acao CHAR(1), IN pidExemplo INTEGER, IN pdsExemplo VARCHAR(50)) BEGIN DECLARE msg VARCHAR(1000) DEFAULT "sem mensagem"; DECLARE excecao SMALLINT DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET excecao = 1; /* faça aqui a verificação de suas regras de negocio para gravação desta tabela*/ IF pdsExemplo = "" OR (Acao <> "I" AND pidExemplo = 0) THEN SET msg = "Erro na passagem de parametros"; ELSE START TRANSACTION; /*Inclusao*/ IF Acao = "I" AND excecao = 0 THEN INSERT INTO exemplo(dsExemplo) VALUES (pdsExemplo); IF excecao = 1 THEN SET msg = "Erro ao inserir na tabela exemplo"; ROLLBACK; END IF; END IF; IF Acao <> "I" AND excecao = 0 THEN SET @idExemplo = pidExemplo; END IF; /*Alteracao*/ IF Acao = "A" and excecao = 0 THEN UPDATE exemplo SET dsExemplo = pdsExemplo WHERE idExemplo = @idExemplo; IF excecao = 1 THEN SET msg = "Erro ao atualizar"; ROLLBACK; END IF; END IF; /*Exclusao*/ IF Acao = "E" and excecao = 0 THEN DELETE FROM exemplo WHERE idExemplo = @idExemplo; IF excecao = 1 THEN SET msg = "Erro ao excluir"; ROLLBACK; END IF; END IF; /*Se tudo deu certo, então finaliza confirmando a gravação.*/ IF excecao = 0 THEN COMMIT; IF Acao = "I" THEN SET msg = "Incluido com sucesso"; ELSE IF Acao = "A" THEN SET msg = "Alterado com sucesso"; ELSE SET msg = "Excluido com sucesso"; END IF; END IF; END IF; END IF; SELECT msg AS msg; END$$ DELIMITER ;$$
  5. Em vez de fazer por trigger faça por storage procedure. É mais prático, seguro, mais controlável, pode emitir mensagem de retorno e, ao contrário do que o DavilX falou no tópico anterior, controles de regras de negócio, não sobrecarregam o servidor.
  6. chrystoffer, Você precisa corrigir a entrada. O programa que gera o csv. É lá que está o problema. Não adianta corrigir o lado da importação de dados.
  7. Pelo que vi, o único campo usado por este select é o content.id. substitua o trecho ORDER BY content. DESC LIMIT 5,20;porORDER BY content.id DESC LIMIT 5,20;Se você não for capaz disso, peça a quem gerou o código, que faça pra você.
  8. Não era o que eu queria. Mas acho que posso te ajudar com o que você colocou em seu post inicial. No seu sql, descrito no post inicial e reproduzido abaixo: SELECT content.id AS id FROM nc0r8_k2_items AS content WHERE content.published = 1 AND content.trash = 0 AND content.access IN (1,1) AND ( content.publish_up = '0000-00-00 00:00:00' OR content.publish_up <= '2015-07-23 17:56:24' ) AND ( content.publish_down = '0000-00-00 00:00:00' OR content.publish_down >= '2015-07-23 17:56:24' ) AND ( content.catid = 88 ) AND content.language in ('en-GB','*') ORDER BY content. DESC LIMIT 5,20;Está faltando um campo para o order by na linhaORDER BY content.???esta faltando um campo aqui??? DESC LIMIT 5,20;
  9. Está faltando o id aqui: call alter_cad_for(?cade o id?, "rua 7","emp padrão ltda","empforte","são fco","pirapora","sp","99999-999","porter_email","999999","88888");
  10. Se está faltando linhas, é porque o arquivo csv está sem o \n na terminação de alguma linha de registro. Verifique o programa que está gerando o csv ou questione quem está gerando o csv Se estiver sobrando linhas, então é porque o arquivo csv está com \n onde não deveria e está gerando registro de forma incompleta. Peça ou faça um teste gerando o csv com algum outro caracter no fim do registro. Tipo @ ou # e faça a carga com load data infile usando este caracter como sinalizador de fim de linha(registro)
  11. Sim. por isso aconselhei que você importasse para uma tabela com um único campo varchar(1000) por registro. Voce esta usando o load data infile para importação? Se sim faça assim: create table tempimport( linha varchar(1000) )engine MyISAM; LOAD DATA INFILE 'file_name.txt' INTO TABLE tempimport LINES TERMINATED BY '\r\n'; Use \r\n se estiver usando windows como seu sistema operacional ou\n se fou outro sistema operacional. Após importar paraa tabela temporária trate a importação para a tabela definitiva usando uma storage procedure ou sua liguagem de programação preferida.
  12. Vale a pena criar uma tabela temporária, com engine MyISAM, com um único campo, para receber cada linha de seu csv e tratar, em um segundo momento, estes registros para a tabela definitiva.
  13. Quando você remove após a importação de csv para mysql? Ou seja, após estar em sua base de dados mysql?
  14. faça assim: select `engine` from information_schema.tables where table_schema="SeuBancoDeDados" AND table_name = "NomeDeSuaTabela"
  15. de o seguinte comando para autorizar o usuario a usar a procedure: GRANT EXECUTE ON PROCEDURE `NomeDoBancoDeDados`.`banco_de_talentos_export` TO `usuario`@`ip`;
  16. Para completar e responder sua pergunta. Tabela temporárias devem ser criadas em momentos especiais, como este, comum objetivo específico e para serem utilizadas por um breve período. Elas podem ser físicas, de preferencia com engine MyISAM, quando a quantidade de dados for muito grande; e podem ser virtuais, com engine MEMORY, quando a quantidade de dados form pequena. No seu caso a necessidade de evitar o table scan, que estava ocorrendo, foi a razão principal para o uso deste tipo de tabela.
  17. Pelo que você postou, eu criaria uma tabela temporária com este select SELECT CD_ORGAO FROM e13cv_teste GROUP BY CD_ORGAO E um índice por CD_ORGAO para atender o inner join deste trecho: ) m ON n.CD_ORGAO = m.CD_ORGAO INNER JOIN e13m_teste o ON n.CD_ORGAO = o.CD_ORGAOSeu inner join atual está deteriorado por falta de índice e está realizando table scan no resultado do select acima a cada linha lida em e13cv_teste.Esta é a causa da lentidão.
  18. Denis Courcy

    UPDATE por data

    Movendo MySQL -->>PHP
  19. Coloque suas tabelas no engine InnoDB. Faça assim: DELIMITER $$ DROP PROCEDURE IF EXISTS cad_for $$ CREATE PROCEDURE cad_for( IN p_endereco varchar(40), IN p_razsocial varchar(40), IN p_nomefantasia varchar(40), IN p_bairro varchar(40), IN p_cidade varchar(30), IN p_uf varchar(2), IN p_cep varchar(9), IN p_email varchar(50), IN p_cnpj varchar(14), IN p_ie varchar(10) ) BEGIN DECLARE msg VARCHAR(1000) DEFAULT "sem mensagem"; DECLARE excecao SMALLINT DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET excecao = 1; START TRANSACTION; INSERT INTO pessoas(endereco, razsocial, nomefantasia, bairro, cidade, uf, cep, email) VALUES(p_endereco, p_razsocial, p_nomefantasia, p_bairro, p_cidade, p_uf, p_cep, p_email); IF excecao = 1 THEN SET msg = "ALERTA: Erro ao inserir na tabela de pessoas"; ROLLBACK; ELSE SELECT DISTINCT LAST_INSERT_ID() INTO @idPessoas FROM pessoas; IF excecao = 1 THEN SET msg = "ALERTA: Erro ao buscar o ultimo ID inserido em pessoas"; ROLLBACK; ELSE INSERT INTO fornecpj(cnpj, ie, pessoa_id) values(p_cnpj, p_ie, @idPessoas); IF excecao = 1 THEN SET msg = "ALERTA: Erro ao inserir na tabela de fornecpj"; ROLLBACK; END IF; END IF; END IF; IF excecao <> 1 THEN COMMIT; SET msg = "ALERTA: Registro Incluido com sucesso"; END IF; SELECT msg AS msg; END$$
  20. Qual comando você está dando para obter esta mensagem em retorno?
  21. Quem quiser ajudar que o faça por MP.
×
×
  • Criar Novo...