BANCO DE DADOS: É importante usar sufixo e prefixo para criar tabelas? Porque?

3 08 2011

Olá!

Resolvi escrever sobre sufixo e prefixo para criação de tabelas em banco de dados pois notei que esse assunto as vezes não é tão claro como deveria.

Bom, diante da pergunta se “É importante usar sufixo e prefixo para criar tabelas? ” já posso dizer que a resposta é “SIM”, é importante!

Pra entendermos, vamos pensar na situação onde temos 2 tabelas, Pessoa e Departamento. Logicamente, uma pessoa está ligada à um departamento, isso quer dizer que vai existir uma query de ligação entre elas. Mas, imagine que temos o Nome do Departamento e o Nome da Pessoa. Desta forma temos 2 campos descritos da mesma forma: “Nome”, a princípio sem o sufixo.

Agora vamos à query:

SELECT Pessoa.Nome, Departamento.Nome FROM Pessoa, Departamento

À principio a query vai funcionar e está correta, porém podemos dizer que, para longas queryes (o que é normal) a falta do sufixo ou prefixo torna a cláusula SQL menos legível e nos dá um pouco mais de trabalho para incluir o nome das tabelas de origem. Então vamos adotar o seguinte sufixo: NomePes para a tabela Pessoal e NomeDep para a tabela departamento. Assim, temos a segunte query:

SELECT NomePes, NomeDep FROM Pessoa, Departamento

Imaginando uma query com 3 ou 4 tabelas e diversos Joins, realmente o código fica extremamente legível.

Da mesma forma podemos definir um prefixo para a chave primária da tabela, como por exemplo CodPessoa e CodDepartamento.

É isso, até a próxima!





MYSQL: Alter table – de Float para Decimal com 2 casas – Problema com PagSeguro

9 01 2011

Primeiro post sobre desenvolvimento do ano de 2011!

Surgiu a seguinte questão de um cliente: Na tabela produtos o campo ‘valor’ estava como float. Porém isso causava um grande problema. Quando o cliente ia realizar a compra através do PagSeguro, o valor 6.4 (Seis reais e quarenta centavos) ia através do pag seguro sem virgula (64) e então o pagSeguro convertia automaticamente para a seguinte forma 0,64! Ou seja, um produto que custava 6 reais passou a custar 64 centavos! :-| Tenso né?! Pois é.

Nota-se que os produtos que possuem o valor: 5.44 o pagSeguro convertia corretamente, ou seja, ele tirava a virgula, ficando 544, e depois incluía a virgula após as 2 primeiras casas, ficand 5,44. Desta forma podemos identificar que os produtos que tinham apenas 1 casa decimal depois da virgula eram os que causavam o problema.

Vamos à solução! :)

Estudando os tipos de campo, achamos que é perfeitamente viável utilizar o tipo DECIMAL. Assim, montamos o seguinte comando SQL:

ALTER TABLE produtos MODIFY valor DECIMAL(5,2)

Explicando o código: Altere a tabela produtos, modificando o campo valor para o tipo decimal, onde este decimal tem no máximo 5 dígitos (99.999), neste caso temos produtos de no máximo 100 mil reais. E que o valor decimal sempre fique com 2 casas decimais após a vírgula.

Boa Semana!





Como inserir CONSTRAINT depois que a tabela já existe? Alter table!

17 12 2010

Essa semana surgiu a seguinte necessidade:

Foram criadas tabelas sem constraints! E agora chegou a hora de corrigir este problema! Como?

Imagine uma tabela endereco, onde esta tabela tem ligação com a tabela usuario. Ou seja, se o usuário que está na tabela tiver um endereço cadastrado na tabela endereco, ele não pode ser deletado. Primeiro devemos deletar o registro da tabela endereco!

Segue o exemplo!

ALTER TABLE endereco 
ADD CONSTRAINT FK_endereco_id_usuario
FOREIGN    KEY (id_usuario)
REFERENCES usuario(id)

Explicação:
1 – Tabela a ser alterada
2 – Ação à ser executada: Adicionar Constraint com o nome de FK_endereco_id_usuario
3 – Chave estrangeira desta tabela
4 – Tabela pai e o campo de ligação

Bom final de semana!





Alter Table SQL: Como incluir um campo na tabela e definir seu valor Default

22 08 2010

Vamos tratar um pouco de SQL. A alguns dias, tratando de um projeto de desenvolvimento de site, tive que resolver uma situação inusitada em SQL. Vejamos:

Precisei incluir na tabela o campo status. Este campo deveria receber como valor default o número 1. Este campo só poderia receber o valor 0 ou 1 inicialmente. Pode ser que posteriormente apareça um outro status. Vamos lá!

ALTER TABLE tabela ADD status int(1) default 1

Codigo aparentemente fácil. Defini como “int(1)” para que recebe apenas 1 dígito, porém pode ser de 0 à 9, se posteriormente precisar incluir outro status. O parte “default 1″ indica que inicialmente todas linhas que contém o campo status contém o valor 1, que pode ser alterado depois. E finalmente o “ADD” que adiciona o campo status.

Legal! Até a próxima!





Existe truncate no PEAR DataObject? Delete existe!

28 11 2009

Dae galera, desta vez vou estar postando uma solução, mas espero que não seja a única. Estive nos últimos dias pesquisando por truncate no Pear Dataobject, porém sem sucesso. Mas, como eu tinha urgência em finalizar um script php, descobri uma maneira de limpar todos os dados da tabela utilizando delete. Resolveu? sim! Mas se estivermos falando de performance, o Truncate do MySql tem algumas vantagens sobre o delete. Se quiser saber mais sobre estas vantagens acesse o post Utilizando TRUNCATE no MySql.

Bom, vamos à minha solução:

Imagine que queremos limpar os dados da tabela cliente:

$doCLIENTE = new DO_CLIENTE;
$doCLIENTE->whereAdd(“COD_CLIENTE IS NOT NULL”);

Até aqui instanciamos o DO e definimos o where. Neste caso o COD_CLIENTE é NOT NULL, assim todos as linhas da tabela obrigatoriamente contém um COD_CLIENTE. Agora vem o segredo do pear para utilizar o delete, com o método whereAdd:

$doCLIENTE->delete(DB_DATAOBJECT_WHEREADD_ONLY);

Isso mesmo, utiliza-se o parâmetro DB_DATAOBJECT_WHEREADD_ONLY. Desta forma o método vai considerar o whereAdd antes de apagar as linhas. Sem este parâmetro o whereAdd é ignorado!

Pronto! Aqui eu finalizei minha implementação. Se alguem conseguir uma solução que tenha a mesma performance do Truncate do MySql deixa a dica ai blz! Abraço! ;)





Utilizando TRUNCATE no MySql. É a mesma coisa que o DELETE?

25 11 2009

Você precisa apagar rapidamente todos as linhas da tua tabela? Utilize o TRUNCATE!
Legal! Esse comando é estremamente útil, fácil e mágico! Simplesmente limpa tudo. Tabela zeradinha.

Você pode perguntar: “Qual a vantagem se existe o delete que apaga todas as linhas?

Bom, vamos lá! O comando TRUNCATE é equivalente ao DELETE que deleta todas as linhas, mas existem algumas diferenças práticas em algumas circunstâncias.
Para uma tabela InnoDB antes da versão 5.0.3 do MySql, InnoDB processa TRUCATE TABLE deletando as linhas uma a uma. A partir do MySQL 5.0.3, a deleção linha por linha é usada somente se existe alguma FOREIGN KEY constraints que referencie a tabela. Se não
existir FOREIGN KEY constraints, InnoDB executa rápido o truncate porque realiza um drop na tabela original e cria uma tabela vazia com as mesmas definições. Isto é extremamente mais rápido do que deletar linha por linha. Show!

Mas vc pode realizar uma segunda pergunta. “E o contador AUTO_INCREMENT?

É resetado! Exatamente! Começa do zero! Claro, também a partir do MySql 5.0.3. Desta forma, sempre que você usar o TRUNCATE, independentemente se há restrição de chave estrangeira, o contador é resetado!

Vamos à um exemplo?

TRUNCATE nome_da_tabela

Fácil?

Abraço.

Fonte: mysql.com

Dilberto Rosa





Problema com datetime do MySql e PHP

18 11 2009

Hoje Eu e a Luciane enfrentamos um problema: Realizar um select em um campo datetime do MySql. Parece simples? Mas não foi!

Em nossas consultas sempre realizamos pesquisas no banco de dados com campos do tipo datetime, porém nunca enfrentamos a situação em que o resultado sempre vinha vazio sendo que temos dados em banco. Desta forma começamos a perguntar: Porque o aqua (nossa ferramenta para consultas à banco de dados) não traz o resultado?

Nosso select no aqua era o seguinte:

select * from tabela where campo_data = current_date

Bom, normalmente, para outras consultas esse comando sql funcionaria. Desta vez não foi bem assim.

Dando uma analisada no conteúdo da tabela no banco, identificamos as seguintes datas:

16/11/2009 11:39:00
16/11/2009 10:30:03

Desta forma, podemos identificar que, apesar de serem mesmas datas, o datetime permite gravação de hora, minuto e segundos. Essa foi a primeira pista.

A segundo pergunta foi: Como estão sendo gravados estes dados?

Identificamos que no PHP, na realização do insert em banco de dados, o programador pegou a data atual com o seguinte comando: “now”. Agora temos a segunda pista. O comando “now” do PHP traz a data atual, acompanhada de hora, minuto e segundos! Assim, quando era realizado insert em banco, era gravado a data com a hora atual, porém na busca estavamos utilizando apenas a data. O resultado do SQL era vazio pois a data era a mesma mas a hora não.

Como resolver?

A idéia inicial foi alterar a função PHP de ‘now’ para date(‘Y-m-d’). E deu certo!

Ao utilizar a função “date”, o PHP grava a data no campo, com a hora zerada. Desta forma a consulta sql desconsidera a hora para aquela linha, trazendo o registro. É isso!

Abraço.





Como criar uma view com MySQL

20 10 2009

Bom, se você chegou aqui, significa que deve imaginar as vantagens de se criar uma view, ou então quer aprender um pouco sobre views.

Vou citar as 2 principais vantagens em se criar uma view:

1) Agilidade evitando retrabalho ao montar queryes;

2) Performance. Imagine que você tem uma boa query que levou horas para ser desenvolvida. Esta query traz todos os dados necessários e você considerou a melhor performance. Assim, é extremamente útil criar uma view com esta query. Desta maneira, evita-se que outro usuário possa estar criando a mesma query com uma performance mais baixa.

Bom, vamos ao exemplo prático!

Sintaxe:

CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

a) CREATE OR REPLACE

A declaração CREATE VIEW cria uma nova view ou substitui uma view existente se for seguida da cláusula OR REPLACE. Se a view não existe a declaração CREATE OR REPLACE VIEW é a mesma coisa que CREATE VIEW. Também vale lembrar que, se a view não existe, CREATE OR REPLACE VIEW é a mesma coisa que ALTER VIEW.

b) Cláusula select_statement

Esta cláusula fornece a definição da exibição. Você pode criar a view a partir de tabelas base ou outras views;

ATENÇÃO:

A definição da view é “congelada” na criação da view. Desta forma é muito importante entender que as tabelas que surgem depois não afetam a definição da view. Imagine que você definiu a view com SELECT * em uma tabela. As colunas adicionadas à tabela depois da criação da view, não se tornam parte da view. Podemos dizer neste caso que a view deverá ser alterada se os novos campos forem interessantes para você.

c) Cláusula ALGORITHM

A cláusula ALGORITHM afeta o modo como o MySQL processa a view. As cláusulas DEFINER e SQL SECURITY especifica o texto de segurança a ser usado durante a verificação dos privilégios de acesso em tempo de invocação da view. A cláusula WITH CHECK OPTION pode ser utilizada para restringir inserções ou alterações de linhas em tabelas referenciadas pela view.

d) Privilégios

O comando CREATE VIEW requer privilégios para a view e alguns privilégios para cada coluna selecionada pelo comando SELECT. Colunas utilizadas em outras partes no SELECT, deve ter permissão para execuar SELECT. Se for utilizado OR REPLACE, você deve ter o privilégio DROP para a view.

e) Especificando a base de dados

Uma view pertence a um banco de dados. Por padrão, um novo modo de exibição é criado no banco de dados padrão. Para criar a exibição explícita de um determinado banco de dados, especifique o nome como db_name.view_name ao criá-lo.

Exemplo simples:
CREATE VIEW teste.viewTeste AS SELECT * FROM tabela1;

Neste exemplo simples, criamos uma view com o nome viewTeste, na base de dados teste, onde o conteúdo da view é SELECT * da tabela base tabela1.

Tabelas base e views compartilham o mesmo namespace na base de dados, então a base de dados não pode contar a mesma tabela base e uma view que tenha o mesmo nome.

Uma view pode ser criada a partir de diversos tipos de SELECT. Pode referir-se às tabelas de base ou outras views. Pode user JOINS, UNION e subqueries.

Neste próximo exemplo, estamos criando a tabela t, com 2 campos do tipo INT. Inserimos algum valor na tabela, criamos a view v e realizamos um SELECT na view. Segue o exemplo:

1. mysql> CREATE TABLE t (qty INT, price INT);
2. mysql> INSERT INTO t VALUES(3, 50);
3. mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
4. mysql> SELECT * FROM v;

+——+——-+——-+
| qty | price | value |
+——+—s—-+——-+
| 3 | 50 | 150 |
+——+——-+——-+

Neste exemplo, na linha 3, criamos a view onde temos 3 campos e o terceiro campo é a multiplicação dos campos qty e price e recebe o label “value”.

É isso pessoal, no próximo post tratarei de restrições de uma view e trazendo outros exemplos!

Abraço e boa semana!

Fonte:
Create View

Tradução e comentários:
Dilberto Rosa





Entendendo a cláusula Distinct do SQL

30 09 2009

Esse post tem uma simples finalidade: Esclarecer a cláusula Distinct, o que realmente ela faz e como utilizá-la.

Vamos lá. Antes da explicação, vamos à definição no dicionário, isso vai ajudar muito.

Traduzindo no google:

Distinct
adjetivo: distinto, nítido e diferente;

Levando ao pé da letra temos a definição de algo que não é igual. Mas como isso é aplicado á uma tabela de banco de dados? Simples. Sabemos que uma tabela é formada por Colunas e linhas. As colunas são os campos da tabela, as linhas é o conteúdo de cada campo, para cada registro efetuado. Como sabemos que os campos não se repetem, então a única coisa que pode repetir são as linhas. Assim temos nossa primeira definição técnica do distinct:

Distinct: Realiza uma query, trazendo apenas linhas distintas.

Você pode perguntar: “Mas em cada linha, os campos podem ser todos iguais, ou apenas um ou outro igual. Como o distinct vai entender isso?”

Bom, o distinct é um pouco radical. Como seu objetivo é trazer as linhas que são diferentes, se houver algo diferente na linha, ele traz ela uma vez. Se a próxima linha for idêntica a essa que ele ja trouxe, ele descarta, pois senão teremos linhas iguais. Beleza?

Vamos à prática!

Imagine a seguinte tabela ‘usuario’:

id nome telefone altura
1 Beto (41)8403-8899 1.74
2 Gabriel (41)9954-7894 1.10
3 Paty (41)9996-5687 1.61
4 Mônica (41)8544-8998 1.82
5 Beto (41)8403-8899 1.75
6 Beto (41)8403-8890 1.74


Agora realizariamos a seguinte query:
SELECT distinct nome,telefone FROM usuario;

O que teremos de resultado?

Vamos escrever a query na nossa linguagem!

Traga todos os nomes e telefones, onde as linhas são diferentes;

Antes de vermos o resultado, vamos reparar nos dados relevantes:

1) Os registros com id 1,5 e 6 possuem o mesmo nome;
2) Os registros com id 1 e 6 possuem as alturas iguais;
3) Os registros com id 1 e 5 possuem os telefones iguais;

O resultado da query vai ser:

nome telefone
Beto (41)8403-8899
Gabriel (41)9954-7894
Paty (41)9996-5687
Mônica (41)8544-8998
Beto (41)8403-8890

Como saber o que vai vir?

Bom, o distinct vai olhar as coisas na seguinte ordem:

1) Quais campos você pediu?
2) Dentre de todos os registros, quais linhas são distintas?

Como pedimos apenas nome e telefone, são esses campos que o distinct vai analisar. Se repararmos ele trouxe o usuario Beto 2 vezes, porque o telefone não é igual! Desta forma, ele analisa todos os campos como se fossem uma coisa só. Se tiver um dos campos diferente do que ele já trouxe, ele considera um novo registro à ser trazido! Simples né?

É isso, logo estaremos postando novos assuntos relacionados a distinct e group by!

Até a próxima e boa semana!

Dilberto Rosa








Seguir

Obtenha todo post novo entregue na sua caixa de entrada.