Arquivo

Archive for the ‘Banco de dados’ Category

Backup de uma tabela do MySQL

Estamos fazendo uma higienização e deletando dados duplicados do MySQL referente a um antigo bug.
Estamos testando em ambiente de QA (lógico) e não queremos perder os dados dessa tabela. Então basta executar os 2 comandos abaixo que já copia a estrutura da tabela e depois copia os dados.

CREATE TABLE newtable LIKE oldtable; 
INSERT newtable SELECT * FROM oldtable;

Simples não? Aproveitem.

Fonte: http://stackoverflow.com/questions/3280006/duplicating-a-mysql-table-indexes-and-data

 

Categorias:Banco de dados

Importando csv para o MySQL

As vezes é mais fácil trabalhar com banco de dados do que excel (pelo menos para desenvolvedores… 🙂 )
Temos um ambiente MySQL e abaixo um comando simples para importar um csv dentro de uma tabela do banco.
Lembrando que as colunas precisam estar exatamente iguais.

LOAD DATA LOCAL INFILE '/Users/amazzon/pedidos_sige.csv'
REPLACE INTO TABLE pedidos_sige
CHARACTER SET 'utf8'
FIELDS TERMINATED BY ',' ENCLOSED BY '\"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
Categorias:Banco de dados

Trabalhando com “Jobs” no MySQL

Tenho bons conhecimentos de SQL Server e agora trabalhando com um sistema em MySql tive que fazer um “Job”.
Na versão Micosoft do banco de dados, um “Job” é uma um script que você configura para rodar de tempos em tempos. É como um Schedule Task do Windows no banco de dados.

No MySql ele é chamado de “EVENT”.

Criei um EVENT que exclui da tabela de erros os registros com mais de 1 mês “de vida”.

delimiter |
ALTER EVENT purge_erroritem
    ON SCHEDULE EVERY 1 DAY
    COMMENT 'Apaga erros com mais de 1 mês de existência!'
    DO
      BEGIN
          delete from feedeater.ErrorItem
          where Date < DATE_SUB(CURDATE(),INTERVAL 30 DAY);
          INSERT INTO feedeater.ErrorPurge(`DateTime`) VALUES(NOW());
      END|

delimiter ;

Para ver os eventos configurados:

SHOW EVENTS; -- mostra todos os eventos
SHOW EVENTS FROM mydatabasename; -- mostra eventos de um banco específico

Recupera o script de um evento específico

SHOW CREATE EVENT purge_erroritem;

Algumas referências que utilizei:

http://dev.mysql.com/doc/refman/5.1/en/events.html
http://dev.mysql.com/doc/refman/5.1/en/create-event.html
http://www.sitepoint.com/working-with-mysql-events/

Categorias:Banco de dados

Lock no MySQL

Tá com erro abaixo no MySQL?

Error Code: 1205. Lock wait timeout exceeded; try restarting transaction

 

Isso resolve os paranauês:

set innodb_lock_wait_timeout=100
show variables like ‘innodb_lock_wait_timeout’;

Categorias:Banco de dados

SQL Server – Delete com inner join

Preparei um script que limpa o banco de dados SQL. Em um dos scripts foi necessário fazer um inner join com outra tabela e a solução é bem simples e trivial. Mas não segue o padrão dos outros comandos:

delete produto from produto left join sku
on produto.idProduto = sku.idproduto
where produto.IdProduto IN (select idProduto from #ProdSemCodRef)		
     and (sku.IdSku is null or sku.IdSku not in 
        (select StockKeepingUnitId from skuseller))

Fonte: http://databasically.com/2011/08/31/using-sql-to-delete-rows-from-a-table-using-inner-join/

 

Procedure com tabela temporária

A algumas semanas atrás precisei montar um script para verificar em que nível está cada produto dentro de uma categoria. Vale a pena documentar e lembrar a utilização de tabela temporária.

—————————-

CREATE TABLE #CategoriaNivel (
idCategoria int NOT NULL,
idCategoriaPai int NULL,
ultimoNivel bit NOT NULL)

-- INICIALIZA AS VARIÁVEIS
DECLARE @idcat INTEGER;
DECLARE @idcatPai INTEGER;
DECLARE @idcatTemp INTEGER;
DECLARE @nivel bit;

set @idcat = NULL;
set @idcatPai = NULL;
set @idcatTemp = NULL;
set @nivel = NULL;
-- Declara cursor
DECLARE db_cursorAllCategorias CURSOR FOR
SELECT idCategoria, idCategoriaPai from Categoria with (NOLOCK)

OPEN db_cursorAllCategorias
FETCH NEXT FROM db_cursorAllCategorias INTO @idcat, @idcatpai;

-- LOOP NOS REGISTROS SELECIONADOS
WHILE (@@FETCH_STATUS = 0)
BEGIN
-- COLOQUE AQUI OS COMANDOS SQL DA SUA PROCEDURE

set @idcatTemp = null;

SELECT @idcatTemp = idCategoria from categoria with (NOLOCK) 
where idCategoriaPai = @idcat;

if @idcatTemp is null
BEGIN
set @nivel = 1
END
else
BEGIN
set @nivel = 0
END

INSERT INTO #CategoriaNivel(idCategoria,idCategoriaPai,ultimoNivel) 
VALUES(@idcat, @idcatpai, @nivel)
-- BUSCA AS INFORMAÇÕES DO PRÓXIMO REGISTRO
FETCH NEXT FROM db_cursorAllCategorias INTO @idcat, @idcatpai;
END
-- (FIM DO LOOP NOS REGISTROS SELECIONADOS) ///

-- FECHA E DESTROI O CURSOR
CLOSE db_cursorAllCategorias;
DEALLOCATE db_cursorAllCategorias;

--------

-- Validação
/*
SELECT * from categoria where idCategoriaPai IN(
SELECT idCategoria
FROM #CategoriaNivel
where ultimoNivel =1)
*/
select count(*) TOTPRODUTOSNIVELINTERMEDIARIO from produto
where idCategoria in(
SELECT idCategoria
FROM #CategoriaNivel
where ultimoNivel = 0)
and FlagAtiva = 1

select count(*) TOTPRODUTOSULTIMONIVEL from produto
where idCategoria in(
SELECT idCategoria
FROM #CategoriaNivel
where ultimoNivel = 1)
and FlagAtiva = 1

drop table #CategoriaNivel

—————————-

SQL – Como funcionam os famosos “Joins”

Sempre é bom relembrar como funcionam os comandos de “Join” do SQL. A imagem abaixo é uma “cola” perfeita.
Aproveitem.