Pular para o conteúdo

Gerenciando banco de dados com MySQL (parte 2)

Nesta segunda parte do artigo irei demonstrar outros comandos SQL, além de mostrar como manter a integridade em suas tabelas e como tornar o seu banco de dados mais seguro.
Jefferson Estanislau da Silva jeffestanislau
Hits: 159.399 Categoria: Banco de Dados Subcategoria: MySQL
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Parte 2: Restrições de integridade

São regras que servem para prevenir a entrada de informações inválidas pelos usuários. Para isso, o SGBD provê ferramentas para regras de integridade, afim de evitar a inconsistência dos dados que nele serão armazenados.

Valores nulos


Para evitar que um campo possa conter valor nulo (ou não conter valor algum) deve-se utilizar a cláusula NOT NULL após a definição da coluna, como já demonstrado anteriormente:

mysql> CREATE TABLE alunos (
-> nome VARCHAR(50) NOT NULL,    // não aceita valor nulo
-> endereco VARCHAR(50) NULL     // aceita valor nulo
);

Valores Duplicados


Há situações onde o valor armazenado em um campo de um registro deve ser único em relação a todos os registros da tabela, para isso usamos a cláusula UNIQUE:

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
mysql> CREATE TABLE alunos (
-> nome VARCHAR(50) NOT NULL,
-> CPF INT(11) UNIQUE,       // não deve haver dois registro com o mesmo CPF
...
);

Valores Inválidos


Há situações onde o valor de um campo deve obedecer a uma regra. Para que ele fique restrito a um conjunto de valores, utiliza-se a cláusula CHECK:

mysql> CREATE TABLE alunos (
-> nome VARCHAR(50) NOT NULL,
-> sexo CHAR(1) CHECK(sexo IN ("M", "F")),   // obriga usar M ou F
...
);

Valores default


Pode-se definir um valor padrão para um campo acrescentando à sua definição a cláusula DEFAULT:

mysql> CREATE TABLE alunos (
-> nome VARCHAR(50) NOT NULL,
-> cidade VARCHAR(30) DEFAULT "Nova Friburgo") ...

Campo chave ou chave primária


Como já comentado anteriormente, o campo chave é um campo muito importante para nossa tabela. Sua função é identificar univocamente uma linha do registro da tabela. Toda tabela deve possuir um campo chave. Quando este é definido, fica implícito as cláusulas UNIQUE e NOT NULL para este campo, não sendo necessário a especificação destas.

mysql> CREATE TABLE alunos (
-> matricula VARCHAR(5) NOT NULL,
-> nome VARCHAR(50) NOT NULL,
-> PRIMARY KEY(matricula));   //  define o campo matricula como chave
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
   1. Introdução
   2. Restrições de integridade
   3. Visualizando dados de maneira mais organizada
   4. Uso de funções
   5. Subqueries
   6. Segurança no acesso aos dados
   7. A tabela user
   8. A tabela db
   9. O comando flush privileges
   10. Conclusão

Banda Larga: Será que você tem mesmo?

Gerenciando banco de dados com MySQL (Parte 1)

O maravilhoso Xandros Linux Desktop

AMSN, uma opção Open Source para o Messenger da Microsoft

Implementando scripts PHP com MySQL

MySQL Workbench no Slackware 14.0

Instalando o phpmyAdmin no Debian Etch

Instalando o MySQL no Slackware

Resolva Problemas com o MySQL Workbench no Linux Mint 21.1

Configurando Apache + MySQL + PHP no Slackware

#1 Comentário enviado por hotforms em 22/02/2004 - 10:07h
Estou utilizando o codigo abaixo, aguem saberia me dizer como faço para ele funcionar, eu quero que ele me de to tatal dos valores do campo 'ordem'.

<? $soma = mysql_query("SELECT SUM($ordem) FROM menu_admin");?>
<?echo "Total $soma; "?>;
#2 Comentário enviado por mmoscz em 14/05/2004 - 11:10h
<? $query = mysql_query("SELECT SUM(ordem) as soma FROM menu_admin");?>
<?php $tupla = mssql_fetch_array($query); ?>
<?php $soma = $tupla["soma"]; ?>
<?echo "Total $soma" ; ?>

Veja q troquei o retorno da query
removi o $ do campo order
fiz com q o retorno da função sum, seja armazenado um um alias chamado soma
com o fetch_array, peguei as colunas q vem da query
o comando fetch cria um array e mandei o valor da coluna para
a variavel $soma
#3 Comentário enviado por removido em 13/01/2005 - 15:57h
Muito bom o artigo!!
Se for possível, dê sequência a ele!
;-)
EJ
#4 Comentário enviado por ft_xavier em 17/02/2005 - 11:43h
Pessoal,

Segui os passos desse excelente artigo sobre manipulacao do mysql para criar uma databse, usuario e definir o acesso dele a somente essa database criada. Só que porem, ele ainda continua a ver as demais e ter acesso a elas. Como posso fazer pra resolver isso ???

Grato.
#5 Comentário enviado por jeffestanislau em 17/02/2005 - 15:14h
ft_xavier,

Você me enviou este comentário estando na página 7, tabela user, aqui você cria o usuário para acessar o mysql como um todo...

Se quer prender o usuário em uma única tabela, você também deve criar o usuário na tbela DB, descrevendo seu nome de acesso e a tabela ao qual ele pode acessar...

blz!!!
#6 Comentário enviado por ft_xavier em 17/02/2005 - 17:25h
Ok amigo,

Mas foi exatamente isso que eu fiz, mas mesmo assim, ele continua vendo as demais db's, soh que naum tem acesso de rw nelas...

Grato pela ajuda...
#7 Comentário enviado por kl31n em 09/03/2005 - 00:15h

Ok......legal o artigo....
mas gostaria de saber tipo.....
se existem StoredProcedures no MySql
ou como o MySql trata as operações
para fazer com que realmente aconteça
o Client-Server
tipo...o sistema manda as informações e
o BG eh que grava elas e se vira com tudo.......
#8 Comentário enviado por Hernando em 03/05/2005 - 11:01h
Mais uma vez gostaria de agradece-lo pela presteza nos artigos... e acredito que assim esteje concluido o mini manual ajudando a todos que queiram ingressar no mundo do MySQL... Queria dar a dica que abra um novo artigo dizendo sobre injeção de sql para que todos que sigam esse artigo possam se previnir antes de serem prejudicados pois a má estruturação pode causar grandes danos...

[]'s
#9 Comentário enviado por rafael_simao em 26/10/2005 - 15:17h
Artigo de excelente qualidade !
#10 Comentário enviado por f4br1c10 em 26/01/2006 - 11:24h
o Artigo parte 01 e o parte 02... Show!

:)
#11 Comentário enviado por poulghet em 26/12/2006 - 19:07h
Valeu gostei muito dos dois (Parte 1 e 2)
#12 Comentário enviado por worm em 10/09/2007 - 14:46h
As 2 partes do artigo estão ótimas cara, cairam como uma luva pra mim! show!! Agora são referência pra mim pro MySQL
#13 Comentário enviado por megatron_rj em 19/07/2008 - 03:18h
Otimo artigo,
Realmente estou no aguardo das continuações, se é que elas acontecerão!!!
Grande abraço,
#14 Comentário enviado por adilsom em 19/05/2009 - 18:59h
ola, estou com um problema, tenho um sisetma que foi feito pra mysql4, e agora preciso fazer funcionar com mysql5.

So que em uma pagina da este erro
"
Database error: Invalid SQL: SELECT SUBSTR(t1.starttime,1,10) AS day, sum(t1.sessiontime) AS calltime, sum(t1.sessionbill) AS cost, count(*) as nbcall,sum(t1.buyratecost) FROM call t1 WHERE UNIX_TIMESTAMP(t1.starttime) >= UNIX_TIMESTAMP('2009-05-19') GROUP BY SUBSTR(t1.starttime,1,10) ORDER BY day
MySQL Error: 1064 (You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'call t1 WHERE UNIX_TIMESTAMP(t1.starttime) >= UNIX_TIMESTAMP('2009-05-19') GROU' at line 1)
Database error: Invalid SQL: SELECT count(*) FROM call t1 WHERE UNIX_TIMESTAMP(t1.starttime) >= UNIX_TIMESTAMP('2009-05-19')
MySQL Error: 1064 (You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'call t1 WHERE UNIX_TIMESTAMP(t1.starttime) >= UNIX_TIMESTAMP('2009-05-19')' at line 1)
Database error: next_record called with no query pending.
MySQL Error: 1064 (You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'call t1 WHERE UNIX_TIMESTAMP(t1.starttime) >= UNIX_TIMESTAMP('2009-05-19')' at line 1)
"

Detalhe, no phpmyadmin com mysql4 faço esta busca:

SELECT substr(t1.starttime,1,10) AS day, sum(t1.sessiontime) AS calltime, sum(t1.sessionbill) AS cost, count(*) as nbcall,sum(t1.buyratecost)FROM call t1 WHERE UNIX_TIMESTAMP(t1.starttime) >= UNIX_TIMESTAMP('2009-05-19') GROUP BY SUBSTR(t1.starttime,1,10) ORDER BY day

e me retorna perfeito, e no mysql5 da erro.


#15 Comentário enviado por ramontcruz em 05/11/2009 - 19:08h
virou minha referencia!!
um abraço!!!
#16 Comentário enviado por henbran em 14/12/2009 - 14:48h
Boa tarde ...!!!!
GOSTARIA DE SABER SE ALGUÉM PODERIA ME ORIENTAR SOBRE O USO DO JOIN EM 1 CONSULTA SQL.

Tenho uma tabela de maquinas e outras de uso_maquinas. Preciso de uma consulta sql que busque na tabela maquina, todas as maquinas que não estão em uso. É 1 projeto de telecentro comunitário. Trabalho com PHP, MySql/postgre (uso recursos PDO).
Olhem por favor a string de consulta:

SELECT maquina.id_maquina, maquina.num_maq
FROM maquina
RIGHT JOIN
(usotelecentro RIGHT JOIN maquina ON maquina.id_maquina = usotelecentro.id_maquina)
ON usotelecentro.dt_utc >='2009-12-14'
WHERE maquina.id_tele_centro = 2

1º) campos a retornar os dados
2º) tabela de maquinas
3º) inicio da instrução JOIN
4º) primeira condição JOIN {se houver alguma máquina do telecentro em questão, em uso, ....}
5º) segunda condição JOIN {..., verificar se é da data atual}
6º) condição WHERE

Temos 2 tabelas, uma é a tabela fato (dados fixos) e a outra é a tabela tempo (dados inseridos conforme o uso). Usa-se o computador por 1 hora ou + e quando abre a tela para verificar quais computadores estão livres, referentes a esse telecentro, identificar se já/ou não está preenchido o campo hora_fim_de_uso.

É um projeto da prefeitura de Guarulhos - SP da qual sou programador PHP a 6 meses.
Obrigado

Contribuir com comentário

Entre na sua conta para comentar.