Verificar se ja existe registro no INSERT

Precisei esses dias de uma query que fizesse a consulta do registro no momento do Insert.
Geralmente eu utilizaria replace com um indice unico para o campo que não pode repetir.

Você pode utilizar o índice de qualquer forma, mas levantaria exceção, então eu prefiro fazer a consulta antes e só retornar a exceção caso de erro no Insert.

O princípio é simples, concatenar uma consulta com o insert.

insert into TABELA (nome)
select * from (SELECT ‘taliba’) as TEMP
where not exists (
select nome from TABELA where nome = ‘taliba’
) limit 1

No caso acima na “tabela” tem um campo “nome”, quero verificar antes de inserir se ja existe o nome ‘taliba’, caso contrario ele insere o registro.

Simples não?

Desenvolvendo uma loja virtual – Parte 1

Como meu negócio é banco crei esse artigo para explicar todas as funções que podemos usar em banco de dados Mysql para uma loja virtual.

Primeiro vamos levantar o que precisamos para uma loja virtual:

  1. Sistema de cadastro e alteração de produtos ( como um CMS )
    – Gerenciamento de usuários do sistema
    – Departamentos / Sub-departamentos
    – Marcas
    – Produtos
    – Gerenciamento de usuarios da loja
    – Acompanhamento de pedidos
    – Relatórios
  2. O Front-End da loja.
    – Cadastro de usuarios
    – Listagem de produtos
    – Cesta de produtos
    – Pedido / Venda

Para uma loja simples acho que isso basta. Agora vamos à criação do banco. Pra isso vamos usar o Mysql WorkBench

Crie um layer, vamos chamalo- de “ADMIN” , vamos colocar aqui as tabelas exclusivas do gestor.

Agora Insira uma nova tabela no layer, vamos chama-la de “tb_usuario”, collation latin1, innodb.
Insira os campos: usr_id, usr_nome,usr_email e usr_status conforme a imagem abaixo.

Vamos criar também uma tabela para o armazenamento das senhas. tb_senha, latin1, innodb, com os campos
snh_id e snh_senha, clique na ferramenta de relacionamento 1:n  e clique na tabela de senha e depois na tabela de usuarios. sua modelagem deve ficar como a minha:

tabela de usuarios e senhas
tabela de usuarios e senhas

 Proximo passo? Criar o índice único da tabela de senhas e o insert padrao. Em breve na Parte 2 desse artigo.

[]`s

base64 encode e base64 decode no mysql

No mysql 5.1 (que uso atualmente), não existe um função nativa para base64, pelo que pesquisei, nem para a versão 5.4. o que fazer? GOOGLE.

Nos resultados da busca encontrei muita gente procurando uma solução, um modulo em “c” e um script que cria as funções. Não é o ideal, mas o código esta bem estruturado e serve de exemplo aqui no blog.

Os temas abordados nesse script são:

– Criando Funções o Mysql
– Criando uma função para encode/decode em base64, lembrando que a lógica da função voce pode utlizar em outras linguagens que não sejam sql PHP, Asp , Java, JavaSncript …

Você encontra o script em: http://wi-fizzle.com/downloads/base64.sql
Por Ian Gulliver.

Acesso restrito por nível de usuário.

Esse por foi pedido pelo Kilderson Sena da Artigos & Tutoriais de onde faço parte mas ainda não postei nada 😛 .

Bom, ja fiz alguns sistemas em PHP com MySql e é claro precisavam de algum tipo de segurança, alguns com níveis de acesso que eu chamo de Perfil. Para começar devemos primeiro pensar na Aplicação, utilizarei como teste uma aplicação com nível de acesso por Telas.

Primeiro teremos uma tabela com as Telas do sistema “tb_tela”:

tla_id INT not null auto_increment primary key
tla_nome VARCHAR(45) not null

Só isso, um código para a tela, e um nome para a mesma, você deverá utilizar esse nome e código para a geração do menu.

Agora a tabela de Usuários “tb_usuario”:

usr_id INT not nullauto_increment  primary key            “Código do usuário”
usr_login varchar(20) not null              “Nome de usuário, utilizado para logar”
usr_senha varchar(100) not null            “Senha, de preferência utilize MD5”
prf_id INT not null                                       “Código do perfil logo a baixo tem a tabela”

Pra deixar melhor, você pode criar um índice único no campo usr_login para que não ocorra de cadastrar usuários com logins idênticos, imagina dois “admin” ?

A tabela de Perfil onde são cadastrados os Níveis de acesso “tb_perfil”:

prf_id INT not null auto_increment primary key
prf_nome varchar(45) not null

Agora o relacionamento entre Tela e Perfil gerando um acesso válido “tb_permissao”:

prm_id INT not null auto_increment primary key
tla_id INT                                     “código da tela”
prf_id INT                                    “código do perfil.”

 

Ok, não entendeu patavinas? eu explico.

Cada usuário tem um perfil (tb_perfil), cada tela do seu sistema esta cadastrada na tb_tela.
Ao criar um relacionamento entre perfil e tela  automaticamente eu crio uma permissão para esse perfil a essa tela.
Agora você pode usar sua linguagem de preferência e aplicar a logica ao modelo.

Abraços
Kleber Taliba Martins

RowID no Mysql, mostrando o numero sequencial

Existem algumas formas de retornar o numero sequencial do registro em uma query no mysql.
No Oracle temos o RowId, mas no mysql temos que trazer na unha mesmo. mais ou menos assim:

SET @rowId :=0;
SELECT @rowId := @rowId + 1 , campo from tb_tabela;

Veja a Aplicação em uma Stored Procedure:

DELIMITER $$
CREATE `sp_rowId`()
BEGIN

SET @rowid := 0;
select @rowid:= @rowid+1 as rowid,campo1,campo2 from tb_tabela;

END$$

DELIMITER ;

Selecionar apenas dias uteis

Vai um post sobre como listar os registros com data em dias úteis, de segunda a sexta.
A função WEEKDAY() traz o dia da semana, ela retorna um inteiro correspondente ao dia.

0 – Segunda
1 – Terça
2 – Quarta
3 – Quinta
4 – Sexta
5 – Sabado
6 – Domingo

Sendo assim nossa consulta fica:

mysql> SELECT tbl_data FROM tb_table WHERE WEEKDAY(tbl_data) NOT IN (5,6) ;

Triggers em Mysql

Um artigo prático, com o intuito de mostrar como funciona e como usar uma trigger no mysql.

A trigger nada mais é que uma açao que será chamada quando (INSERT / UPDATE /DELETE) for executado.
Quando listei INSERT UPDATE e DELETE estou dizendo que é SÓ assim , nao funciona com outras funções CREATE / DROP / SELECT, pq?, porque é de graça, no oracle tem.

A sintaxe de uma trigger é bastante simples

CRIE TRIGGER minhatrigger (ANTES / DEPOIS) (INSERT / UPDATE/ DELETE)  ON tabela

FOR EACH ROW bla bla bla;

No nosso Bla bla bla é útil lembrar de uma coisa, ao fazer o AFTER/INSERT você pode pegar o valor inserido com NEW.campo e para pegar um valor antigo OLD.campo.

Exemplo:
CREATE TRIGGER  depois_cadastro AFTER INSERT ON cadastro
FOR EACH ROW SET INSERT INTO log values (NEW.id);

A trigger depois_cadastro DEPOIS de inserir na tabela de cadastros. insere o novo ID na tabela de log.

Simples não?

Curiosidades sobre o formato TIMESTAMP no Mysql

Zapeando ontem achei um artigo com várias curiosidades úteis sobre o TIMESTAMP, fiquei curioso porque eu dificilmente uso esse tipo de dado em minhas aplicações, mas voce sabia que:

  • Por default TIMESTAMP é NOT NULL, e se voce incluir NULL ele grava a DATA e HORA no momento como um NOW().
  • As datas possuem um intervalo entre 1970-01-01 00:00:01 e 2038-01-19 03:14:06, qualquer valor fora disso resulta em exceção.

E outras, leia mais aqui Blog do chines Haidong Ji