Introdução a MySQL
Programação de Servidores
Marx Gomes Van der Linden
http://marx.vanderlinden.com.br/
Onde armazenar dados?
Praticamente toda aplicação web precisa lidar
com grandes volumes de dados.
Dados podem ser armazenados em arquivos
(texto ou binários)
Redundância
Manutenção e Escalabilidade
Integridade
Eficiência
http://marx.vanderlinden.com.br/
2
Bancos de Dados
Um banco de dados é um conjunto de dados
armazenados de forma automaticamente
organizada e gerenciada.
Um banco de dados é controlado por uma
aplicação:
(SGBD)
Todo o acesso a dados é feito indiretamente,
por meio do SGBD.
http://marx.vanderlinden.com.br/
3
Vantagens
Consistência e Integridade
Um banco de dados bem organizado evitar o
armazenamente desnecessário de
informações redundantes, evitando a
possibilidade de inconsistência.
Eficiência
SGBDs são altamente otimizados para
armazenar e buscar informação da maneira
mais eficiente possível.
http://marx.vanderlinden.com.br/
4
Vantagens
Manutenção
Um Sistema de Gerenciamento de Banco de
Dados cuida automaticamente de todos os
detalhes da implementação física do
armazenamento de dados.
Escalabilidade
Sua aplicação pode crescer sem mudanças
fundamentais no design.
http://marx.vanderlinden.com.br/
5
Banco de Dados Relacional
Composto por Entidades (ou Tabelas).
Cada tabela tem campos.
Os campos de uma tabela podem fazer
referência a outras tabelas.
http://marx.vanderlinden.com.br/
6
Banco de Dados Relacional
http://marx.vanderlinden.com.br/
7
SQL
Structured Query Language
Linguagem-padrão para manipulação de
informações em bancos de dados.
Definições de dados
Consultas
Modificações, Inserções, Exclusões
Controle de Acesso
http://marx.vanderlinden.com.br/
8
Bancos de Dados em PHP
PHP tem suporte a praticamente todos os
sistemas de Bancos de Dados em uso
atualmente:
MS SQL Server
MySQL
Oracle
PostgreSQL
SQLite
etc..
http://marx.vanderlinden.com.br/
9
Design de Banco de Dados
Descrição das entidades que compõem o
sistema.
Definição das propriedades de cada entidade
que se deseja armazenar.
Elaboração dos relacionamentos entre as
entidades.
http://marx.vanderlinden.com.br/
10
MySQL
MySQL é um dos SGBDs mais
amplamente usados no mundo.
Software livre/open source
Desenvolvido pela MySQL AB, de
propriedade da Sun Microsystems.
'M' no LAMP / WAMP
Leve, eficiente e robusto
Excelente integração com PHP
http://marx.vanderlinden.com.br/
11
MySQL Cliente/Servidor
Cliente MySQL
(Linha de
Comando)
PHP
Servidor
MySQL
Módulo
Cliente MySQL
http://marx.vanderlinden.com.br/
Banco de
Dados
SQL
Linhas de Dados
E/S Arquivo 12
Arquitetura Cliente/Servidor
O Servidor cuida do controle de concorrência.
Não há conflito se dois clientes tentarem
modificar o mesmo dado ao mesmo tempo.
O Servidor tem embutido um mecanismo de
controle de acesso.
O Cliente e o Servidor podem estar distribuídos
fisicamente de qualquer maneira.
http://marx.vanderlinden.com.br/
13
SQL
A unidade básica de SQL é a consulta (query):
Executa uma operação no Banco de Dados.
Pode modificar o BD.
Retorna:
Se a instrução foi ou não um sucesso.
O número de linhas afetadas no banco de
dados.
Se aplicável, retorna um conjunto de
linhas contendo as informações
solicitadas. http://marx.vanderlinden.com.br/
14
SQL
Características de SQL:
Não faz distinção entre maiúsculas e
minúsculas.
Ignora espaços.
Cada instrução termina com ;
Comentários podem ser feitos com --
http://marx.vanderlinden.com.br/
15
Cliente MySQL
O cliente-padrão MySQL é uma aplicação de
linha de comando.
Interativo
Script
Uso:
mysql [opções...] [nome_bd]
http://marx.vanderlinden.com.br/
16
Opções da linha de comando
-u, --user=nome
Nome do usuário
Padrão: usuário do sistema)
-p, --password[=name]
Senha
Padrão: ''
-h, --host=nome
Endereço do servidor
Padrão: localhost
http://marx.vanderlinden.com.br/
17
Opções da linha de comando
-E, --vertical
Exibe a saída verticalmente (equivalente a
usar \G)
-H, --html
Exibe a saída como tabelas HTML
http://marx.vanderlinden.com.br/
18
SELECT
O comando SELECT busca e retorna uma
informação do servidor.
Pode ser usado com qualquer combinação de:
Valores literais.
Funções embutidas.
Campos da tabela.
http://marx.vanderlinden.com.br/
19
SELECT
SELECT com valor literal:
mysql> SELECT 'Hello, World!';
+---------------+
| Hello, World! |
+---------------+
| Hello, World! |
+---------------+
1 row in set (0.00 sec)
http://marx.vanderlinden.com.br/
20
NOW()
A função NOW() retorna a data e hora atuais.
mysql> SELECT NOW();
+---------------------+
| NOW()
|
+---------------------+
| 2008-10-05 01:43:59 |
+---------------------+
1 row in set (0.00 sec)
http://marx.vanderlinden.com.br/
21
USER()
A função USER() retorna o usuário atual.
mysql> SELECT USER();
+----------------+
| USER()
|
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
http://marx.vanderlinden.com.br/
22
VERSION()
A função VERSION() retorna a versão atual do
MySQL.
mysql> SELECT VERSION();
+--------------------+
| VERSION()
|
+--------------------+
| 5.0.51a-3ubuntu5.1 |
+--------------------+
1 row in set (0.00 sec)
http://marx.vanderlinden.com.br/
23
SELECT
Mais de uma informação pode ser solicitada no
mesmo comando.
mysql> SELECT USER(), VERSION();
+----------------+--------------------+
| USER()
| VERSION()
|
+----------------+--------------------+
| root@localhost | 5.0.51a-3ubuntu5.1 |
+----------------+--------------------+
http://marx.vanderlinden.com.br/
24
SELECT
A interface de linha de comando permite
quebrar um comando em várias linhas.
mysql> SELECT USER(),
-> VERSION();
+----------------+--------------------+
| USER()
| VERSION()
|
+----------------+--------------------+
| root@localhost | 5.0.51a-3ubuntu5.1 |
+----------------+--------------------+
1 row in set (0.00 sec)
http://marx.vanderlinden.com.br/
25
\G
Concluindo o comando com \G, ao invés de ;,
exibe os resultados de uma maneira
alternativa:
mysql> SELECT USER(), VERSION()\G
*************** 1. row ***************
USER(): root@localhost
VERSION(): 5.0.51a-3ubuntu5.1
1 row in set (0.00 sec)
http://marx.vanderlinden.com.br/
26
\c
É possível cancelar um comando antes de
enviá-lo ao servidor, usando \c
mysql> SELECT USER(),
-> VERSION()\c
mysql>
http://marx.vanderlinden.com.br/
27
Criando um Banco de Dados
A primeira ação a ser tomada em uma nova
instalação do MySQL é criar um novo banco de
dados.
Vários bancos de dados podem estar
instalados ao mesmo tempo.
Cada banco de dados é identificado por um
nome.
http://marx.vanderlinden.com.br/
28
CREATE DATABASE
Para criar um novo banco de dados, utiliza-se o
comando CREATE DATABASE.
Sintaxe:
CREATE DATABASE nome_bd;
mysql> CREATE DATABASE teste;
Query OK, 1 row affected (0.08 sec)
http://marx.vanderlinden.com.br/
29
CREATE DATABASE
A sintaxe completa de CREATE DATABASE
inclui a possibilidade se somente criar o BD caso
ele ainda não exista, além de outras opções.
CREATE DATABASE [IF NOT EXISTS]
nome_db [CHARACTER SET charset]
[COLLATE collation];
charset: Conjunto de caracteres dos campos
de texto (padrão: latin1)
collation: Regras para ordem alfabética de
texto (padrão:http://marx.vanderlinden.com.br/
latin1_swedish_ci)
30
Conjunto de caracteres
O comando SHOW CHARACTER SET mostra
todos os conjuntos de caracteres disponíveis
no MySQL.
Algumas opções:
latin1 (cp1252 West European) (padrão)
ascii
(US ASCII)
utf8
(UTF-8 Unicode)
http://marx.vanderlinden.com.br/
31
Collation
Collation se refere às regras para decidir a
ordem alfabética de strings, usada em
operações de ordenação.
Cada Collation é dependente de um conjunto
de caracteres.
O comando SHOW COLLATION mostra todas
as collations disponíveis no MySQL.
http://marx.vanderlinden.com.br/
32
Collation
Opções de Collation disponíveis para o
conjunto de caracteres latin1:
latin1_swedish_ci (padrão)
latin1_german2_ci
latin1_german1_ci
latin1_danish_ci
latin1_general_ci
latin1_general_cs
latin1_spanish_ci
http://marx.vanderlinden.com.br/
33
SHOW DATABASES
O comando SHOW DATABASES mostra os
bancos de dados existentes no sistema:
mysql> SHOW DATABASES;
+--------------------+
| Database
|
+--------------------+
| information_schema |
| sistema_xy
|
| website
|
| teste
|
http://marx.vanderlinden.com.br/
+--------------------+
34
USE
Depois, é necessário informar ao MySQL que
começaremos a usar o banco de dados criado.
Sintaxe:
USE nome_bd;
mysql> USE teste;
Database changed
http://marx.vanderlinden.com.br/
35
ALTER DATABASE
Para alterar as configurações de um banco de
dados, usa-se o comando ALTER DATABASE.
Sintaxe:
ALTER DATABASE [nome_db]
[CHARACTER SET charset]
[COLLATE collation];
Se omitido, nome_db se refere ao banco de
dados em uso.
mysql> ALTER DATABASE COLLATE
latin1_spanish_ci;
http://marx.vanderlinden.com.br/
Query OK, 1 row
affected (0.00 sec)
36
DROP DATABASE
Para excluir permanentemente um banco de
dados do sistema, usa-se o comando DROP
DATABASE.
mysql> DROP DATABASE teste;
Query OK, 0 rows affected (0.05 sec)
http://marx.vanderlinden.com.br/
37
Mecanismos de Armazenamento
MySQL suporta diversos mecanismos físicos
(engines) para o armazenamento de tabelas.
É possível ter, no mesmo banco de dados,
várias tabelas, cada uma com um mecanismo
diferente.
Para exibir todos os mecanismos instalados,
pode-se usar o comando SHOW ENGINES.
http://marx.vanderlinden.com.br/
38
Mecanismos de Armazenamento
Mecanimos otimizados em disco:
MyISAM (padrão)
MERGE (tabelas MyISAM concatenadas)
InnoDB
Outros:
MEMORY → Armazenamento em RAM.
BLACKHOLE → /dev/null.
ARCHIVE → Não permite modificações.
CSV → Arquivos de texto separados por vírgula.
http://marx.vanderlinden.com.br/
39
Mecanismos de Armazenamento
Cada banco de dados é armazenado em um
subdiretório no diretório de armazenamento de
MySQL (geralmente /var/lib/mysql/).
Cada tabela corresponde a:
Um arquivo .frm
Outros arquivos com o mesmo nome, e extensões
de acordo com o mecanismo.
http://marx.vanderlinden.com.br/
40
Mecanismos de Armazenamento
MyISAM → .MYD (dados), .MYI (índices)
MERGE → .MRG (tabelas MyISAM unidas)
InnoDB → .ibd (dados e índices)
ARCHIVE → .ARZ (dados), .ARM
(metadados)
CSV → .CSV (dados), .CSM (metadados)
http://marx.vanderlinden.com.br/
41
Mecanismos de Armazenamento
Para exibir os Mecanismos de Armazenamento
disponíveis, pode-se usar o comando SHOW
ENGINES.
http://marx.vanderlinden.com.br/
42
******************* 1. row *******************
Engine:
MyISAM
Mecanismos
de Armazenamento
Support: DEFAULT
Comment: Default engine as of MySQL 3.23 with
great performance
******************* 2. row *******************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful
for temporary tables
******************* 3. row *******************
Engine: InnoDB
Support: YES
Comment: Supports transactions, row-level
locking, and foreign keys
******************* 4. row *******************
Engine: BerkeleyDB
http://marx.vanderlinden.com.br/
43
Support: NO
CREATE TABLE
Para criar uma nova tabela no banco de dados,
usa-se o comando CREATE TABLE.
Sintaxe:
CREATE TABLE [IF NOT EXISTS]
nome_tabela ( definição )
[ENGINE = nome_engine]
[CHARACTER SET charset]
[COLLATE collation];
http://marx.vanderlinden.com.br/
44
CREATE TABLE
A definição consiste de pares:
nome TIPO,
nome TIPO, ...
É possível especificar um mecanismo de tabela
(engine)
Se não for especificada, é usado o padrão.
É possível especificar um conjunto de
caracteres e/ou uma collation.
http://marx.vanderlinden.com.br/
45
CREATE TABLE
Exemplo:
mysql> CREATE TABLE tabela
-> (
->
f FLOAT(10,4),
->
c CHAR(15) NOT NULL DEFAULT 'none',
->
i TINYINT UNSIGNED NULL
-> );
Query OK, 0 rows affected (0.04 sec)
http://marx.vanderlinden.com.br/
46
DESCRIBE
O comando DESCRIBE exibe a estrutura de
uma tabela:
DESCRIBE nome_tabela;
mysql> DESCRIBE tabela;
+-------+---------------------+------+-----+---------+-------+
| Field | Type
| Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| f
| float(10,4)
| YES |
| NULL
|
|
| c
| char(15)
| NO
|
| none
|
|
| i
| tinyint(3) unsigned | YES |
| NULL
|
|
+-------+---------------------+------+-----+---------+-------+
http://marx.vanderlinden.com.br/
47
Aspas
MySQL usa 3 tipos de aspas:
Aspas simples ou duplas: Strings
"Hello World"
'Hello World'
Acento grave: nomes de bancos de dados,
tabelas e campos
`meubd`
`usuarios`
`cpf`
Pode ser omitido caso o campo seja
http://marx.vanderlinden.com.br/
uma palavra
simples
48
CREATE TABLE
Exemplo:
mysql> CREATE TABLE `tabela`
-> (
-> `f` FLOAT(10,4),
-> `c` CHAR(15) NOT NULL DEFAULT 'none',
-> `i` TINYINT UNSIGNED NULL
-> );
Query OK, 0 rows affected (0.03 sec)
http://marx.vanderlinden.com.br/
49
Tipos de Dados
No MySQL, a cada coluna de cada tabela deve
ser associado um tipo de dado.
Existem vários tipos de dados, pertencentes a
várias categorias:
Numéricos
Inteiros
Reais
Textos
Dados Binários
Data/Hora
http://marx.vanderlinden.com.br/
50
Tipos de Dados Inteiros
TINYINT → Inteiro de 1 byte
SMALLINT → Inteiro de 2 bytes
MEDIUMINT → Inteiro de 3 bytes
INT → Inteiro de 4 bytes (32 bits)
BIGINT → Inteiro de 8 bytes (64 bits)
http://marx.vanderlinden.com.br/
51
Tipos de Dados Numéricos
Todos os tipos de dados inteiros têm 3 campos
opcionais:
(M) → Largura máxima de exibição (número
de caracteres)
UNSIGNED → Não permite valores negativos
(dobra a capacidade para positivos)
ZEROFILL → Preenche com zeros o espaço
restante, na exibição
http://marx.vanderlinden.com.br/
52
BIT
BIT[(M)]
Armazena uma seqüência de M bits.
Padrão: M = 1
Valores para BIT são especificados de acordo
com a seguinte sintaxe:
b'01001'
http://marx.vanderlinden.com.br/
53
Tipos de Dados Reais
Em todos os casos: M dígitos totais, com D
casas decimais.
FLOAT[(M[,D])] → Número de ponto
flutuante de precisão simples (32 bits)
DOUBLE[(M[,D])] → Número de ponto
flutuante de precisão dupla (64 bits)
DECIMAL[(M[,D])] → Número de ponto fixo.
Padrão: M = 10, D = 0
http://marx.vanderlinden.com.br/
54
Tipos de Dados para Texto
CHAR[(M)] → M caracteres
Padrão: M = 1
VARCHAR(M) → Uma string de, no máximo, M
caracteres
TINYTEXT → Texto de até 255 caracteres.
TEXT[(M)] → Texto de até 64kb.
MEDIUMTEXT → Texto de até 14mb.
LONGTEXT → Texto de até 4gb.
http://marx.vanderlinden.com.br/
55
Conjunto de Caracteres e Collate
Para os campos TINYTEXT, TEXT,
MEDIUMTEXT e LONGTEXT, é possível
especificar separadamente o cojunto de
caracteres e o collate.
Ex:
LONGTEXT [CHARACTER SET charset]
[COLLATE collation]
http://marx.vanderlinden.com.br/
56
Tamanho dos Tipos de Texto
Um campo de texto é armazenado como N+L
bytes:
N bytes, indicando o tamanho do texto
L bytes, onde L é o tamanho do texto,
indicado em N
TINYTEXT → N = 1
TEXT → N = 2
MEDIUMTEXT → N = 3
LONGTEXT → N = 4
http://marx.vanderlinden.com.br/
57
Tipos de Dados Binários
BLOB: Binary Large Object
TINYBLOB → Até 255 bytes
BLOB → Até 64k
MEDIUMBLOB → Até 14mb
LONGBLOB → Até 4GB
http://marx.vanderlinden.com.br/
58
Escolhendo um Tipo de Texto
Texto ou binário?
Diferenciar maiúsculas e minúsculas?
Tamanho fixo (CHAR) ou variável?
Espaço vs. Eficiência
O campo tem valores fixos?
ENUM ou SET
http://marx.vanderlinden.com.br/
59
Tipos de Dados para Texto
ENUM('valor1','valor2',...)
Uma string que pode ter apenas um dos
valores descritos na enumeração.
SET('valor1','valor2',...)
Uma string que pode ter zero ou mais
valores, desde que todos façam parte do
conjunto.
http://marx.vanderlinden.com.br/
60
ENUM e SET
A lista de dados especificada na criação define
os únicos valores legais do campo.
Pode haver ou não distinção entre maiúsculas
e minúsculas, dependendo do collation.
No ENUM, a ordem especificada é a ordem
usada em operações de ordenamento.
Os campos de SET e ENUM são armazenados
como números inteiros:
ENUM: 1 ou 2 bytes
http://marx.vanderlinden.com.br/
SET: 1,2,3,4 ou
8 bytes
61
SET
Múltiplos valores em SET são determinados
por vírgulas.
'carro,trem,avião'
Valores inválidos acrescentados a um SET são
ignorados.
Valores repetidos também são ignorados.
http://marx.vanderlinden.com.br/
62
Tipos de Dados para Data e Hora
DATE → Data, no formato 'CCYY-MM-DD'
De '1000-01-01' a '9999-12-31'
TIME → Hora, no formato 'hh:mm:ss'
De '-838:59:59' a '838:59:59'
DATETIME → Data e hora, no formato, 'CCYYMM-DD hh:mm:ss'
De '1000-01-01 00:00:00' a '9999-12-31
23:59:59'
http://marx.vanderlinden.com.br/
63
Tipos de Dados para Data e Hora
TIMESTAMP → Timestamp 32bits, no formato
'CCYY-MM-DD hh:mm:ss'
De '1970-01-01 00:00:01' a '2038-01-09
03:14:07'
YEAR → Ano, no formato CCYY ou YY
De 1901 to 2155, ou 0000
http://marx.vanderlinden.com.br/
64
Valores de Data e Hora
MySQL tenta interpretar valores para os
campos de data e hora, de acordo com as
convenções:
'YY-MM-DD hh:mm:ss'
'CCYY-MM-DD hh:mm:ss'
'CCYYMMDDhhmmss'
'YYMMDDhhmmss'
CCYYMMDDhhmmss
YYMMDDhhmmss
'CCYY-MM-DD'
http://marx.vanderlinden.com.br/
65
NULL vs. NOT NULL
Para qualquer campo, é possível especificar se
se quer que sejam permitidos valores nulos
(vazios):
NULL (padrão)
NOT NULL
Para a maioria dos campos, é possível
especificar um valor padrão:
DEFAULT valor
http://marx.vanderlinden.com.br/
66
Regras para valores Default
Caso o valor default não seja especificado:
Valores numéricos: 0
Datas e Horas: 0000-00-00 00:00:00
Strings: ''
http://marx.vanderlinden.com.br/
67
PRIMARY KEY
Para especificar uma chave primária, basta
acrescentar após o nome do campo a frase
PRIMARY KEY.
Chaves primárias:
Não podem ter valores repetidos.
Não podem ter valores nulos.
Identificam inequivocadamente uma linha na
tabela.
http://marx.vanderlinden.com.br/
68
AUTO_INCREMENT
A opção AUTO_INCREMENT pode ser
adicionada a qualquer valor numérico.
Novos valores para este campo são
automaticamente incrementados em 1.
Só pode haver um campo AUTO_INCREMENT
em uma tabela.
Útil para índices e chaves primárias.
Automaticamente torna a coluna NOT NULL.
Se não especificada, a contagem começa em
http://marx.vanderlinden.com.br/
1.
69
AUTO_INCREMENT
O valor de uma coluna AUTO_INCREMENT é
igual ao da anterior mais 1 se na nova coluna:
Não for especificado um valor para este
campo.
O novo valor for NULL ou 0.
Novos valores reiniciam a contagem.
http://marx.vanderlinden.com.br/
70
Exemplo: Criacão da Tabela
mysql> CREATE TABLE usuario (
-> login CHAR(30) PRIMARY KEY,
-> datanasc DATE,
-> nome VARCHAR(255) NOT NULL,
-> sexo ENUM('masc','fem') NOT NULL
-> );
Query OK, 0 rows affected (0.00 sec)
http://marx.vanderlinden.com.br/
71
Exemplo: Possíveis Valores
mysql> SELECT * FROM usuario;
+-------+------------+-----------------------+------+
| login | datanasc
| nome
| sexo |
+-------+------------+-----------------------+------+
| kate | 1980-05-18 | Katherine Anne Austen | fem |
| sayid | 1970-04-24 | Sayid Hassan Jarrah
| masc |
| hgale | 1975-02-25 | Benjamin Linus
| masc |
+-------+------------+-----------------------+------+
3 rows in set (0.00 sec)
http://marx.vanderlinden.com.br/
72
Exemplo: Criação da Tabela
mysql> CREATE TABLE sgbd (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> nome VARCHAR(255) NOT NULL,
-> maxcols MEDIUMINT UNSIGNED
-> );
Query OK, 0 rows affected (0.14 sec)
http://marx.vanderlinden.com.br/
73
Exemplo: Possíveis valores
mysql> SELECT * FROM sgbd;
+----+----------------+---------+
| id | nome
| maxcols |
+----+----------------+---------+
| 1 | MySQL
|
3398 |
| 2 | PostgreSQL
|
1600 |
| 3 | Oracle
|
1000 |
| 4 | MS SQL Server |
1024 |
+----+----------------+---------+
4 rows in set (0.00 sec)
http://marx.vanderlinden.com.br/
74
Informações sobre as tabelas
O comando SHOW TABLES exibe a lista de
tabelas existentes no banco de dados.
Sintaxe:
SHOW TABLES;
O comando SHOW CREATE TABLE exibe o
comando usado para criar a tabela, incluindo
os valores default.
Sintaxe:
SHOW CREATE TABLE nometabela;
http://marx.vanderlinden.com.br/
75
SHOW TABLES
mysql> SHOW TABLES;
+-----------------+
| Tables_in_teste |
+-----------------+
| sgbd
|
| usuario
|
+-----------------+
2 rows in set (0.00 sec)
http://marx.vanderlinden.com.br/
76
SHOW CREATE TABLE
mysql> SHOW CREATE TABLE sgbd\G
******************** 1. row ******************
Table: sgbd
Create Table: CREATE TABLE `sgbd` (
`id` int(11) NOT NULL auto_increment,
`nome` varchar(255) collate
latin1_spanish_ci NOT NULL,
`maxcols` mediumint(8) unsigned default
NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT
CHARSET=latin1 COLLATE=latin1_spanish_ci
1 row in set (0.00 sec)
http://marx.vanderlinden.com.br/
77
Tabelas Temporárias
É possível criar tabelas temporárias.
Existem apenas enquanto dura a conexão
com o servidor.
A tabela temporária é vista apenas pelo
cliente que a criou.
Sintaxe:
CREATE TEMPORARY TABLE [IF NOT
EXISTS] nome_tabela ( definição )
[ENGINE = nome_engine]
[CHARACTER SET charset]
http://marx.vanderlinden.com.br/
[COLLATE collation];
78
CREATE TABLE ... LIKE
Para criar uma tabela com a mesma estrutura
de uma tabela existente, usa-se a sintaxe:
CREATE [TEMPORARY] TABLE
[IF NOT EXISTS] nova_tabela
LIKE tabela_antiga
mysql> CREATE TEMPORARY TABLE usuariotmp
LIKE usuario;
Query OK, 0 rows affected (0.12 sec)
http://marx.vanderlinden.com.br/
79
MERGE
O mecanismo MERGE permite tratar várias
tabelas MyISAM como uma só.
Todas as tabelas devem ter exatamente a
mesma estrutura (mesmos nomes e tipos, na
mesma ordem).
Sintaxe:
CREATE [TEMPORARY] TABLE [(...)]
ENGINE = MERGE
UNION = (tabela1, tabela2,
tabela3...)
http://marx.vanderlinden.com.br/
80
Exemplo
CREATE TABLE log_2007 (
dt
DATETIME NOT NULL,
info VARCHAR(100) NOT NULL
) ENGINE = MyISAM;
CREATE TABLE log_2008 (
dt
DATETIME NOT NULL,
info VARCHAR(100) NOT NULL
) ENGINE = MyISAM;
CREATE TABLE log_2009 (
dt
DATETIME NOT NULL,
info VARCHAR(100) NOT NULL
) ENGINE = MyISAM;http://marx.vanderlinden.com.br/
81
Exemplo
CREATE TABLE log_merge (
dt
DATETIME NOT NULL,
info VARCHAR(100) NOT NULL
) ENGINE = MERGE
UNION = (log_2007, log_2008, log_2009);
http://marx.vanderlinden.com.br/
82
DROP TABLE
Para excluir uma tabela, basta usar o comando
DROP TABLE.
Sintaxe:
DROP [TEMPORARY] TABLE [IF EXISTS]
tabela [, tabela2, tabela3...]
http://marx.vanderlinden.com.br/
83
ALTER TABLE
Qualquer característica de uma tabela pode ser
modificada a qualquer momento, usando o
comando ALTER TABLE.
Nomes e tipos de campos
Adicionar
Remover
Modificar
Mecanismo de Armazenamento
Conjunto de caracteres e Collage
http://marx.vanderlinden.com.br/
84
Exemplo: Antes
mysql> SELECT * FROM usuario;
+-------+------------+-----------------------+------+
| login | datanasc
| nome
| sexo |
+-------+------------+-----------------------+------+
| kate | 1980-05-18 | Katherine Anne Austen | fem |
| sayid | 1970-04-24 | Sayid Hassan Jarrah
| masc |
| hgale | 1975-02-25 | Benjamin Linus
| masc |
+-------+------------+-----------------------+------+
3 rows in set (0.00 sec)
http://marx.vanderlinden.com.br/
85
ALTER TABLE ... MODIFY
Para alterar qualquer característica de uma
coluna (tipo, tamanho, chave primária):
ALTER TABLE tabela MODIFY campo
definição
mysql> ALTER TABLE usuario MODIFY login
CHAR(60);
Query OK, 3 rows affected (0.08 sec)
Records: 3 Duplicates: 0 Warnings: 0
http://marx.vanderlinden.com.br/
86
ALTER TABLE ... CHANGE
Para alterar o nome e tipo de uma coluna:
ALTER TABLE tabela CHANGE campo
novonome tipo;
mysql> ALTER TABLE usuario CHANGE nome
primeiro_nome VARCHAR(60);
Query OK, 3 rows affected (0.04 sec)
Records: 3 Duplicates: 0 Warnings: 0
http://marx.vanderlinden.com.br/
87
ALTER TABLE ... ADD
Para adicionar uma nova coluna:
ALTER TABLE tabela ADD campo tipo
[FIRST | AFTER campo];
mysql> ALTER TABLE usuario ADD ultimo_nome
varchar(60) AFTER primeiro_nome;
Query OK, 3 rows affected (0.15 sec)
Records: 3 Duplicates: 0 Warnings: 0
http://marx.vanderlinden.com.br/
88
ALTER TABLE ... DROP
Para remover uma coluna da tabela:
ALTER TABLE tabela DROP campo;
mysql> ALTER TABLE usuario DROP datanasc;
Query OK, 3 rows affected (0.06 sec)
Records: 3 Duplicates: 0 Warnings: 0
http://marx.vanderlinden.com.br/
89
Exemplo: Depois
mysql> SELECT * FROM usuario;
+-------+-----------------------+-------------+------+
| login | primeiro_nome
| ultimo_nome | sexo |
+-------+-----------------------+-------------+------+
| kate | Katherine Anne Austen | NULL
| fem |
| sayid | Sayid Hassan Jarrah
| NULL
| masc |
| hgale | Benjamin Linus
| NULL
| masc |
+-------+-----------------------+-------------+------+
3 rows in set (0.07 sec)
http://marx.vanderlinden.com.br/
90
ALTER TABLE ... ADD PRIMARY KEY
Para transformar um campo em chave
primária:
ALTER TABLE tabela ADD PRIMARY KEY
(campo);
mysql> ALTER TABLE tabela ADD PRIMARY KEY (f);
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
http://marx.vanderlinden.com.br/
91
Outras opções
ENGINE, CHARACTER SET e COLLATE também
podem ser especificados após ALTER TABLE.
mysql> ALTER TABLE tabela ENGINE = InnoDB
CHARACTER SET = utf8 COLLATE
utf8_slovenian_ci;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
http://marx.vanderlinden.com.br/
92