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. Oi, CRITERIO! Veja se última resposta que dei no tópico abaixo responde a sua pergunta. http://scriptbrasil.com.br/forum/index.php?showtopic=108429 att Denis Courcy
  2. Oi, Visitante! Não lembro agora se o MySQL aceita este tipo que vou falar. Se não aceitar verifique a opção 2 que forneço abaixo, ainda nesta resposta. Opção 1 SELECT a, b FROM tabela WHERE a IN (SELECT a FROM tabela GROUP BY a HAVING COUNT(a) > 1 ); A Opção 2 abaixo prevê alguns passos: 1 Criação de uma tabela temporária; CREATE TEMPORARY TABLE temp ( a CHAR(3), qt int, PRIMARY (a) ); 2 Inclusão de registros na tabela temporária; INSERT INTO temp (a, qt) SELECT a, COUNT(a) AS qt FROM tabela GROUP BY a HAVING qt > 1; 3 Sua consulta propria mente dita (neste caso usando um join com a tabela temporária) e, SELECT t.a, t.b FROM tabela t INNER JOIN temp tm ON t.a = tm.a; 4 destruição da tabela temporária. DROP TABLE temp; att Denis Courcy
  3. Denis Courcy

    MySQL Sensitive

    Oi, Fernando! Infelizmente isto não é possível duas limitações: A primeira, por causa do próprio Sistema Operacionalque é caso sensitivo. E como as tabelas residem como arquivos do S.O., então assim também o são; A segunda está no próprio manual do MySQL versão 4.1 seção 1.8.3. Extensões do MySQL para o Padrão SQL-92 que diz: "Nomes de bancos de dados e tabelas são caso sensitivoo no MySQL em sistemas operacionais que possuem o sistema de arquivos caso sensitivoo (como na maioria dos sistemas Unix). Ver Seção 6.1.3, “Caso Sensitivo nos Nomes”.". A seção 6.1.3 reforça o que informei na primeira parte desta resposta e diz:"No MySQL, bancos de dados e tabelas correspondem a diretórios e arquivos em seus diretórios. Consequentemente, o caso sensitivo no sistema operacional irá determinar o caso sensitivo nos nomes de bancos de dados e tabelas. Isto significa que nomes de bancos de dados e tabelas são caso sensitivo na maioria dos Unix e caso insensitivo no Windows. Uma exceção proeminente aqui é o Mac OS X, quando o o sistema de arquivos padrão HPS+ está sendo usado. No entanto o Mac OS X também suporta volumes UFS, esle são caso sensitivo no Mac OS X assim como são no Unix. See Secção 1.8.3, “Extensões do MySQL para o Padrão SQL-92”. NOTA: Apesar de nomes de bancos e tabelas serem caso insensitivo no Windows, você não deve fazer referência a um certo banco de dados ou tabela utilizando casos diferentes na mesma consulta. A consulta a seguir não deve funcionar porque ela chama uma tabela como minha_tabela e outra como MINHA_TABELA." att Denis Courcy
  4. Oi, 'acdestefani'! Sim. foi criado. att Denis Courcy
  5. Denis Courcy

    SHOW TABLES

    Oi, Thales! O manual do MySQL mostra a sintaxe do SHOW TABLES, da seguinte forma: SHOW [FULL] TABLES [FROM db_name] [LIKE 'pattern'] Então, você pode usar SHOW TABLES LIKE 'A%' para buscar todas as tabelas que tenham nomes iniciador por "A"; att Denis Courcy
  6. Denis Courcy

    Método interno

    Oi, Berdam! Este procedimento automatizado só é possível a partir da versão 5.1 do MySQL. att Denis Courcy
  7. Denis Courcy

    criar tabela

    Oi, 'junaooaks'! Por default o MySQL assume que o primeiro atributo timestamp not null da tabela é CURRENT_TIMESTAMP. Declarar CURRENT_TIMESTAMP causa uma redundância que não é tratada pelo MySQL (BUG) e provoca este erro. Declare o atributo simplesmente assim: UltimaAlteracao timestamp NOT NULL O erro vai parar e seu atributo vai ter CURRENT_TIMESTAMP que você deseja. Att Denis Courcy
  8. Denis Courcy

    sql where

    Oi, Visitante! Esta pesquisa fatalmente vai cair em um TABLE SCAN, ou seja vai varrer toda sua tabela independentemente da quantidade de registros a serem retornados. Isto porque as funções usadas avaliam linha a linha da sua cláusula where. Isto não será problema se sua consulta for de vez em quando, mas se for sempre é necessário que você pense em um a forma melhor de armazenar estes dados estruturados. O código é este: Select campo from tabela where substring(campo, 4, 3) between '200' and '299'; att Denis Courcy
  9. Oi, Hilário! A forma mais correta de montar este modelo é através de uma ligação ternária. Ou seja Você precisa de uma tabela extra que será o relacionamento entre Curso x Disciplina e Professor que neste exemplo vou chamar de RL_CURDISCPROF e conterá os atributos de identificação de Curso, Disciplina e Professor respectivamente. Não terá chave primária somente Foreign Keys com constraints para as tabelas de cadastro. CREATE TABLE RL_CURDISCPROF ( id_curso integer unsigned not null id_disciplina integer unsigned not null, id_professor integer unsigned not null ); ALTER TABLE RL_CURDISCPROF ADD CONSTRAINT FK_CURDISCPROF_001 FOREIGN KEY (id_curso) REFERENCES curso(id_curso) ON DELETE NO ACTION, ON UPDATE NO ACTION, ADD CONSTRAINT FK_CURDISCPROF_002 FOREIGN KEY (id_disciplina) REFERENCES disciplina(id_disciplina) ON DELETE NO ACTION, ON UPDATE NO ACTION, ADD CONSTRAINT FK_CURDISCPROF_003 FOREIGN KEY (id_processor) REFERENCES professor(id_professor) ON DELETE NO ACTION, ON UPDATE NO ACTION ; Com isso, você saberá que professor está em que disciplina de que curso e vice versa. NOTA: Esta solução trabalha muito bem com tabelas tipo Innodb. Com tabelas tipo MyISAM somente as constraints não funcionarão. Caso esta solução não resolva seu problema pooste novamente e avaliaremos melhor. att Denis Courcy
  10. Oi, Clécio! Cria via ODBC e BDE. No DataModule Coloque o componente TDatabase, configure a proprieadade DatabaseName com o nome interno de seu banco de dados e na propriedade AliasName coloque o nome que você definiu no ODBC. Defina, também a propriedade LoginPrompt para False e atribua os nomes de usuario e senha que serão utilizados para acessar o servidor de BD. de resto é só utilizar os componentes TQuery e outros para manipulação das tabelas. Quanto ao Login propriamente dito, crie uma tela com dois Tedit (um para login e outro para senha) e desenvolva sua lógica no click do botão OK. Basicamente é isso. att Denis Courcy
  11. Oi, Avalon! Todos os problemas de corrupção de tabelas que encontrei até hoje, com o MySQL, foram ocasionados por falha de Hardware ou do Sistema Operacional. Ainda não tinha tido um relato de uma tabela tão grande, mas vamos avaliar o que pode estar ocorrendo. Primeiro vamos verificar as limitações do MySQL, devido ao tamanho de sua tabela. No Manual, na seção 1.2.2 "Principais Características do MySQL", o autor comenta sobre testes em tabelas co o tamanho informado por você "• Escalabilidade e limites • Lida com bancos de dados enormes. Usamos o Servidor MySQL com bancos de dados que contém 50.000.000 registros e sabemos de usuários que usam o Servidor MySQL com 60.000 tabelas e aproximadamente 5.000.000.000 de linhas. • São permitidos até 32 índices por tabela. Cada índice pode ser composto de 1 a 16 colunas ou partes de colunas. O tamanho máximo do índice é de 500 bytes (isto pode ser alterado na compilação do MySQL). Um índice pode usar o prefixo de campo com um tipo CHAR ou VARCHAR." A Seção 1.2.4. "Qual o Tamanho Que as Tabelas do MySQL Podem Ter?" Mostra a que tamanho as tabelas podem chegar. Por padrão, As tabelas MyISAM (Não sei se é este seu caso) estão limitadas a 4GB. Mas com a adição das cláusulas AVG_ROW_LENGHT e MAX_ROWS este limite pode ser alterado e ultrapassado em muito. Verifique se você já atingiu o limite estabelecido na criação da tabela usando o comando SHOW TABLE STATUS No Exemplo abaixo utilizo o status em cima de uma tabela chamada "weather". mysql> show table status like 'weather' \G *************************** 1. row *************************** Name: weather Type: MyISAM Row_format: Dynamic Rows: 0 Avg_row_length: 0 Data_length: 0 Max_data_length: 4294967295 Index_length: 1024 Data_free: 0 Auto_increment: NULL Create_time: 2003-03-03 00:43:43 Update_time: 2003-03-03 00:43:43 Check_time: 2003-06-14 15:11:21 Create_options: Comment: 1 row in set (0.00 sec) Você pode usar o comando ALTER TABLE para modificar estes valores. Tal como abaixo mysql> alter table weather max_rows = 200000000000 avg_row_length = 50; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 Em segundo lugar, procure falhas em placas de rede, cabos, switches, memória RAM, placa mãe e HD; Verifique, também, se sua rede não está apresentando colisões. Bom, estas são as dicas que tenho para este problema. Faça sob seus próprios riscos Não Esqueça de fazer Backup ANTES att Denis Courcy
  12. Oi, 'Dixavado®'! Esperimente trocar o = pelo IN na sua cláusula WHERE do select principal. Não sei se é o resultado que você deseja, mas funciona. SELECT * FROM produtos WHERE pro_usu_codigo IN (select usu_codigo from usuario where usu_cpf = '11111111111'); att Denis Courcy
  13. Oi, Luis! Faça deste modo: select user, sum(pages) as total_pages from jobs_log Group by user; att Denis Courcy
  14. Prezado Ricardo! Analisei sua solicitação e recomendo que você desenvolva um algorítimo, em sua linguagem de programação, que execute esta terefa. O resultado que você deseja envolve um tipo de rotina chamado "quebra" e várias outras interações que são melhor negociadas através de lógica de programação. Caso você não saiba como montar o algorítimo poste no forum de lógica de programação (http://scriptbrasil.com.br/forum/index.php?showforum=64) que poderemos tentar ajudá-lo. att Denis courcy
  15. Denis Courcy

    Transaction - MyIsam

    Oi, Wellington! Com MyISAM Não. Você pode simular com o delphi usando o try... except. Passo o código amanhã, pois não tenho aqui e não lembro como faz. att Denis Courcy Oi, Wellington! achei aqui em meio a minha bagunça um fragmento de código que pode ser utilizado para esta tarefa. O banco é mysql rodando com BDE via ODBC, mas creio que você possa fazer a adaptação necessária. try dm.banco.StartTransaction; query1.ParamByName('rz').Value:='S'; query1.ExecSQL; dm.banco.Commit; showmessage('EXAME REALIZADO'); except showmessage('não FOI POSSIVEL ALTERAR EXAME AGENDADO'); dm.banco.Rollback; end; att Denis Courcy
  16. Denis Courcy

    Dificuldade com o count

    Oi, Felipe! Sua consulta ficará assim: Select tópico, count(tópico) as qtmensagens, sum(if(status=0,1,0)) as qtrespondidas from tópico t inner join mensagem m on t.tópico = m.tópico group by tópico; Obs.: Por não saber qual campo faz relacionamento entre as tabelas tópico e mensagem usei o campo tópico como integrador entre as referidas tabelas. Faça a adaptação necessária e informe sucesso ou fracasso. att Denis Courcy
  17. Denis Courcy

    (Resolvido) Query

    Simples, retire o asterisco. Assim: Select sum(if(tipo=0, 1, 0) ) as efetuadas, sum(if(tipo=1, 1, 0) ) as recebidas from crjj04; att Denis Courcy
  18. Oi, 'viejoyo'! Sem atributos em comum que possam identificar relacionamentos entre as tabelas sua unica saida será usar a cláusula UNION em seu SELECT. Procure no capítulo 6 do manual do mysql versão 4.1 para detalhes de select com UNION. att Denis Courcy P.S.:Cuidado com o que vai fazer pois isto poderá virar um um emaranhado que nem você entenderá.
  19. Oi, Eduardo! Que eu saiba não há função para este tipo de operação. Normalmente este tipo de interação é feito através de programas chamados de "data-bridges", que lêem os dados de um banco e de tempos em tempos repássa-os ao outro banco. No mysql eu li que isto pode ser feito usando replicação, mas não tenho o material aqui para ajudá-lo. att Denis Courcy P.S: Verifique em http://www.imasters.com.br/artigo/7058/sql..._mysql_parte_1/
  20. Oi, Jarbas! Para o MySQL tanto faz se todos os terminais trabalham com root, ou se cada terminal trabalha com um login diferente. A razão pe simples. O mysql funciona a base de threads. A cada conexão, independente do nome do login, ele cria um thread diferente. Assim, o que determina a perda de performance é o excesso de conexões. Como no seu caso são somente 10 estações, a perda de performance maior seria se o banco de dados estivesse em uma delas, pois assim, além de compartilhar memória para o próprio processamento (cada thead em particular), o mysql teria que compartilhar memória com um usuário em sua própria máquina. Por isso deve-se evitar que o servidor de banco de dados seja utilizado como uma estação. Glossário: Thread, ou linha de execução em português, é uma forma de um processo dividir a si mesmo em duas ou mais tarefas que podem ser executadas simultaneamente. att Denis Courcy
  21. Denis Courcy

    (Resolvido) Query

    Oi, Shelter! se não me falha a memória, o código seria assim: Select * , sum(if(tipo=0, 1, 0) ) as efetuadas, sum(if(tipo=1, 1, 0) ) as recebidas from crjj04; Informe sucesso ou fracasso para que possamos avaliar. att Denis Courcy
  22. Oi, Rodrigo! Analisei seu problema e cheguei a uma solução que passa por alguns passos: 1 Criação de uma tabela temporária e carga dos dados nela (poderia ser uma storage procedure) A tabela temporária deverá ter os campos idcliente e mes. a carga consistem em 12 registro para cada cliente o primary key ficará com os dois campos (idcliente, mes); Create temporary table temp ( idcliente int not null, mes int not null, primary (idcliente, mes) ); 2 A seleção que fornecerá sua resposta Select t.idcliente, t.mes from temp t left join pagamento p on t.clienteid = p.clienteid and t.mes = month(p.datapagamento) where ISNULL(p.idcliente); 3 A exclusão da tabela temporária para liberação de memória Drop temp; Explicando o código: Ao criar a tabela temporária com base na tabela de clientes estabelecemos um relacionamento válido para a tabela de pagamentos que responde a pergunta quem não pagou No Select a cláusula Left Join retornará todas as linhas da tabela temp independente ou não se há correspondente com pagamento. Na cláusula where criamos o filtro para que seja retornado somente o que é desejado. Inconvenientes: A tabela temp tem que ser criada todas as vezes que necessitar rodar este tipo de consulta A comparação t.mes = month(p.datapagamento) resultará em um table scan (ou seja, uma varredura completa em todas as 2 tabelas) porque a função precisa ser avaliada para cada registro da tabela pagamentos. Uma forma de melhorar esta performance seria criar um campo com mês de pagamento e este campo deveria ser indexado) Analise e informe sucesso ou fracasso att Denis Courcy
  23. Para ajudá-lo na confecção de sua select necessito de mais informações (não precisam ser reais apenas um modelo do que você quer). Uma pequena estrutura com os campos mais importantes, tais como: data de pagamento (com informação de preenchimento obrigatório ou não), data de vencimento (com informação de preenchimento obrigatório ou não), etc. Se constam no cadastro somente a data do pagamento att Denis Courcy
  24. Oi, Martinsr! Seu algorítimo está errado. Observe o pseudo código abaixo e adapte-o a sua necessidade. Se ano >= mínimo_desejado e ano <= máximo_desejado então (Ano válido) Se mês >= 1 e mês <= 12 então (mês válido) Se (mês = 1 ou mes = 3 ou mês = 5 ou mês = 7 ou mês = 8 ou mês = 10 ou mês = 12) e (dia >= 1 e dia <= 31) então (dia válido) Senão Se (mês = 4 ou mês = 6, ou mês = 9 ou mês = 11) e (dia >= 1 e dia <= 30) então (dia válido) Senão Se (Resto da divisão de ano = 0) e (dia <= 1 e Dia <= 29) então (mês = Fevereiro Bissexto e Dia Válido) Senão Se (Resto da divisão de ano diferente de 0) e (dia <= 1 e dia <= 28) então (mês = Fevereiro não Bissexto e Dia Válido) Senão (dia inválido) Fim Se Fim Se Fim Se Fim Se Fim Se Fim Se att Denis Courcy
  25. Denis Courcy

    Mysql

    Oi, Cintia! 1- Você tomou o cuidado que falei para não sobreescrever dois bancos com o mesmo nome? 2- No comando do mysqldump você substituiu a string {nome_do_banco} pelo nome do banco de dados que você está querendo backupear? 3- Se a resposta para as duas perguntas acima foram SIM, então verifique se as tabelas do banco que você está querendo backupear não foram inseridas inadivertidamente em outro banco de dados. 4 - Você utilizou um usuário com GRANT total? Tipo root em substituição a string {usuario}? 5 - Se não utilizou, refaça a operação com um usuário que tenha plenos poderes para esta operação. Verifique, por favor e informe o resultado. Pois esta prática eu utilizo direto e raramente dá problema. Quando tem problema eu refaço a operação. att Denis Courcy
×
×
  • Criar Novo...