Escolar Documentos
Profissional Documentos
Cultura Documentos
Arquitetura dos SGBD: níveis externo, conceitual e interno. Linguagens utilizadas DML, DDL e DCL.
1 03 3
Apresentar gráfico do esquema geral da arquitetura do SGBD.
Modelo físico de dados. Introdução ao SQL. Definição das estruturas do banco de dados, utilizando
2 24 3
DDL
Modelo físico de dados. Regras de integridade: chave primária, chave estrangeira, domínios de
2 25 3
atributos.
Comandos de manipulação de dados (DML). Consultas complexas, Funções agregadoras (max, min,
2 30 3
sum, avg, count), Group By, Distinct e Having
O PROCESSO DE NORMALIZAÇÃO
A Notação de Relação tem pequenas variações entre os diversos autores do mercado. Essas
diferenças são rapidamente percebidas e não devem representar um problema. Na apostila e
no curso iremos utilizar a NB (Notação Brasileira) que é a seguinte:
MODELO SIGNIFICADO
X (a;b) X consiste de uma ocorrência de valor para a e para b
X [a|b] X consiste, opcionalmente, de a ou b
X [a] X consiste opcionalmente de um valor para a
X {a;b} X consiste de no mínimo 0 e no máximo infinitas ocorrências de valor para a e b
X .y{a;b}z X consiste de no mínimo y e no máximo z ocorrências de valor para a e b
X consiste de no mínimo y e no máximo infinitas ocorrências de valor para a ,
X.y{a;[b|c]}
a e b ou a e c
estruturas de dados em projetos de Modelagem de Dados, foi introduzida em 1970 por Edgard
Frank (Ted) Codd, na época consultor da IBM, na especificação da 1ª.FN ou 1ª. Forma Normal,
utilizando os conceitos da teoria dos conjuntos – Álgebra Relacional. A proposta consiste em
aplicar uma série de regras sobre a estrutura de dados, candidata à constituição da base de
dados sendo projetada, de modo a eliminar as “falhas de organização dos dados”, já citadas,
que acabam afetando a qualidade e a performance nas operações de guarda, atualização e
recuperação dos dados armazenados.
Determinação - Chaves
DF - Dependência Funcional
DP – Dependência Funcional Parcial
DT – Dependência Transitiva - Transitividade
Dependência Multivalorada
Trivialidade
DEPENDÊNCIA MULTIVALORADA
O valor de um atributo determina um conjunto de valores de um outro atributo.
{CPF} {nome} (um nome para cada CPF)
{CPF} {dependente}(vários dependentes para cada CPF)
Uma dependência multivalorada é representada por:
X Y (X multidetermina Y ou Y é multidependente de X)
= projeção, isto é, o(s) atributo(s) que antecede(m) a flecha é (são) refletido(s) na relação
indicada após a flecha;
= junção, isto é, é (são) copiado/agrupados na relação, indicada antes da flecha, o(s)
atributo(s) relacionado(s) após a flecha; e
U = união, isto é, o(s) atributo(s) relacionado(s) antes do U é (são) agrupado(s) com o(s)
atributo(s) apontado(s) após o U.
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 4 de 71
Matéria:
Código:_____ Nome: __________________________________ Carga Horária ________
Professor:
Código:_____ Nome: __________________________________ Telefone:____________
Representando o Formulário MCA II por meio de Relação com base na Proposta Brasileira
de Notação de Relações:
MCA {CodMCA; DataMCA; Materia (CodMat; NomeMat; ChMat); Professor (CodProf; NomeProf;
TelProf); Alunos.1 {MatricAlu; NomeAlu; DiasLetivos.1{DT; Fi;}10; NotaAlu }50}
MCA { CodMCA; DataMCA; Materia (CodMat; NomeMat; ChMat); Professor (CodProf; NomeProf;
TelProf ) }
AlunosDeMCA { CodMCA; MatricAlu; NomeAlu; DiasLetivos.1 {DT; Fi }10 ; NotaAlu}
MCA {CodMCA; DataMCA; Materia (CodMat; NomeMat; ChMat); Professor (CodProf; NomeProf;
TelProf ) }
AlunosDeMCA { CodMCA; MatricAlu; NomeAlu; NotaAlu}
O SCHEMA PLBD
Utilizando esse método o SCHEMA LBD - Lógico de Banco de Dados (que no Modelo Peter
Cheniano é tratado como ME-R ou DE-R) ficará assim:
Professores
1
N
1 N 1 N
Matérias MCA DiasLetivos
1 N
N
N 1 1
AlunosMCA 1
Alunos
N
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 9 de 71
MC 1
Professores
1
MC 1 MC 2 N MC 4
1 N 1 N
Matérias MCA DiasLetivos
1 N
N
N 1
MC 3 MC 1 1
AlunosDeMCA 1
Alunos
N
MC1 - As tabelas Professores, Matérias e Alunos devem ser criadas antes das demais e entre
elas não há uma ordem obrigatória. Podemos até pressupor que antes de alunos deverão ser
identificadas as Matérias a serem lecionadas, depois os Professores e por último os Alunos,
mas isso é um formosismo não percebível pelo SGBD.
MC2 - A tabela MCA é primária nas relações com AlunosDeMCA e com DiasLetivos e nas outras
relações que mantém, as tabelas primárias (Professores e Matérias) já foram indicadas.
MC3 - AlunosDeMCA, pois AlunosDeMCA é primária em relação a DiasLetivos.
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 10 de 71
MC 1 MA 3
Professores
1
MC 1 MA 2 MC 2 N MA 1 MC 4 MA 6
1 N 1 N
Matérias MCA DiasLetivos
1 N
N
N 1
MC 3 MA 4 MC 1 1 MA 5
AlunosDeMCA 1
Alunos
N
MA1 - A tabela MCA é a base para o preenchimento do documento, assim é ela quem vai
comandar todos os demais acessos.
MA2 e MA3: Ente MA2 e MA3 não há realmente diferença e elas poderiam ter o mesmo índice
MA2. Na sequência as demais tabelas vão sendo acessadas em função da composição das
demais informações.
É importante verificar que as tabelas são mapeadas para o acesso em função do que se
pretende compor de informações, assim é comum termos um único MC - Mapa de Carga e
diversos MAs - Mapas de Acesso, sendo um para cada tela ou Relatório pretendido pela
Aplicação.
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 11 de 71
A LINGUAGEM SQL:
STRUCTURED QUERY LANGUAGE
A SQL apresenta uma série de comandos que permite a definição e administração das
estruturas e objetos de dados, chamada de DDL (Data Definition Language ou Linguagem de
Definição de Dados). A DDL tem nos comandos Create, Alter e Drop sua maior representação.
O comando Create, p.e. é destinado a criação de objetos de Banco de Dados como o próprio
Banco de Dados, as Tabelas que o compõe, as relações existentes entre as tabelas e outros
objetos relevantes para a organização do Banco de Dados.
Há ainda uma subclasse de comandos DML, a DCL (Data Control Language ou Linguagem de
Controle de Dados), que oferece comandos de controle de manipulação de dados como Grant e
Revoke. Estes comandos são importantes por garantirem uma função substancial dos SGBDs
que é a de controle de Integridade Relacional ou Referencial.
A Linguagem SQL tem como grandes virtudes sua capacidade de gerenciar índices, sem a
necessidade de controle individualizado de índice corrente, algo muito comum nas linguagens
de manipulação de dados do tipo registro a registro. Outra característica muito importante
disponível em SQL é sua capacidade de construção de visões, que são formas de visualizarmos
os dados na forma de listagens independente das tabelas e organização lógica dos dados.
Devemos notar que a linguagem SQL consegue implementar estas soluções, somente pelo fato
de estar baseada em Banco de Dados, que garantem por si mesmo a integridade das relações
existentes entre as tabelas e seus índices.
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 12 de 71
4º. No processo de download do XAMPP ler o contrato e aceitar << dar ENTER >>
7º. No quadro “XAMPP FOR WINDOWS” Definir o diretório a ser instalado o XAMPP. Você pode
deixar em branco, o diretório escolhido pelo XAMPP será o de seu nome: C:/XAMPP e clique no
botão INSTALL;
8º. Aguarde o XAMPP instalar o XAMPP Control Panel, o MySQL, o APACHE, e o restante do Kit
XAMPP;
9º. Será aberta uma tela DOS (comandos do DOS) por meio do qual será proposto o seguinte
diálogo:
Should I add shortcuts to the Start Menu / Desktop? (y/n): y << dar ENTER >>
Current directory does not match configured directory.
I must relocate the XAMPP path correctly, should I proceed?
(y/x=exit setup) = y << dar ENTER >>
Should I make a portable XAMPP without drive letters?
Note: - You should use drive letters, if you want use services.
- With USB sticks you must not use drive letters
- Your choice? N << dar ENTER >>
I have set the timezone in ‘php-ini’ and ‘my.ini’ to “America / São Paulo”
You should correct these values if my guess was wrong. Press return to continue.
Please choose (1-7/x): X << dar ENTER >>
ENTRANDO NO MySQL
145270@SPASCHOAL_SFL C:\xampp
# cd mysql
145270@SPASCHOAL_SFL C:\xampp\mysql
# cd bin
145270@SPASCHOAL_SFL C:\xampp\mysql\bin
# mysql -u root -p
Enter password: ( deixado em branco + enter )
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.37 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
create_specification:
[DEFAULT] CHARACTER SET [ =] charset
DEFAULT] | [ COLLATE = [ ] charset
CREATE DATABASE cria um banco de dados com o nome fornecido. Para usar esta
afirmação, é necessário o CREATE privilégio para o banco de dados.
CREATE SCHEMA é um sinônimo para CREATE DATABASE.
Um erro ocorre se o banco de dados existe e você não especificou Se não existir.
Se você criar manualmente um diretório sob o diretório de dados (por exemplo, com mkdir), O
servidor considera um diretório de banco de dados e mostra-se na saída do SHOW
DATABASES.
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 15 de 71
145270@SPASCHOAL_SFL C:\XAMPP
# CD MYSQL
145270@SPASCHOAL_SFL C:\XAMPP\MYSQL
# CD BIN
145270@SPASCHOAL_SFL C:\XAMPP\MYSQL\BIN
# MYSQL -U ROOT –P
ENTER PASSWORD: (DEIXADO EM BRANCO + ENTER)
WELCOME TO THE MYSQL MONITOR. COMMANDS END WITH ; OR \G.
YOUR MYSQL CONNECTION ID IS 2
SERVER VERSION: 5.1.37 SOURCE DISTRIBUTION
TYPE 'HELP;' OR '\H' FOR HELP. TYPE '\C' TO CLEAR THE CURRENT INPUT STATEMENT.
Exclui um Banco de Dados inteiro, com todas as suas tabelas. Para usar esse comando é
necessário ter-se o privilégio DROP no Banco de Dados.
MYSQL>
TIPOS DE DADOS
Depois de criar a base de dados, e uma vez as relações normalizadas, é necessário criar as
tabelas correspondentes dentro da base de dados Mapas. Para cada campo de cada uma da
tabelas, é necessário determinar o tipo de dados que contem, para poder ajustar a estrutura
da base de dados, e conseguir um armazenamento com a menor utilização de espaço.
Os tipos de dados que pode ter um campo, podem-se agrupar em três grandes grupos:
1. Tipos numéricos
2. Tipos de Data
3. Tipos de Cadeia
1 Numéricos:
Existem tipos de dados numéricos, que se podem dividir em dois grandes grupos, os que estão
em vírgula flutuante (com decimais) e os que não.
TinyInt: é um número inteiro com ou sem signo. Com signo a margem de valores válidos é
desde -128 até 127. Sem signo, a margem de valores é de 0 até 255
SmallInt: número inteiro com ou sem signo. Com signo a margem de valores válidos é desde
-32768 até 32767. Sem signo, a margem de valores é de 0 até 65535.
MediumInt: número inteiro com ou sem signo. Com signo a margem de valores válidos é
desde -8.388.608 até 8.388.607. Sem signo, a margem de valores é de 0 até 16777215.
Integer, Int: número inteiro com ou sem signo. Com signo a margem de valores válidos é
desde -2147483648 até 2147483647. Sem signo, a margem de valores é de 0 até
429.496.295
BigInt: número inteiro com ou sem signo. Com signo a margem de valores válidos é desde -
9.223.372.036.854.775.808 até 9.223.372.036.854.775.807. Sem signo, a margem de
valores é de 0 até 18.446.744.073.709.551.615.
Float: número pequeno em vírgula flutuante de precisão simples. Os valores válidos vão desde
-3.402823466E+38 até -1.175494351E-38,0 eté desde 175494351E-38 até
3.402823466E+38.
xReal, Double: número em vírgula flutuante de dupla precisão. Os valores permitidos vão
desde -1.7976931348623157E+308 até -2.2250738585072014E-308, 0 e desde
2.2250738585072014E-308 até 1.7976931348623157E+308
O MySQL 5.0 suporta todos os tipos de dados padrão SQL. Todos os tipos supracitados são
tipos de dados aceitos e podem ter muitos outros sinônimos - palavra que tem exatamente o
mesmo sentido que outra ou quase idêntico. O que temos que ter ciência também é quanto de
espaço por valor é requerido por cada tipo. Tais especificações são expostas na Tabela 1.
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 17 de 71
Tipos Numéricos
MySQL suporta todos os tipos numéricos da ANSI/ISO SQL92. Estes tipos incluem o tipos de
dados numéricos exatos (NUMERIC, DECIMAL, INTEGER, e SMALLINT), assim como o
tipos de dados numéricos aproximados (FLOAT, REAL, e DOUBLE PRECISION). A palavra-
chave INT é um sinônimo para INTEGER, e a palavra-chave DEC é um sinônimo para
DECIMAL.
Os tipos NUMERIC e DECIMAL são implementados como o mesmo tipo pelo MySQL, como
permitido pelo padrão SQL92. Eles são usados por valores para os quais é importante
preservar a exatidão como, por exemplo, dados monetários. Quando é declarado um campo de
algum desses tipos a precisão e a escala podem ser (e normalmente é) especificadas; por
exemplo:
salario DECIMAL(5,2)
Neste exemplo, 5 (precisão) representa o número de digitos decimais significantes que serão
armazenados no valor, e 2 (escala) representa o número de dígitos que serão armazenados
após o ponto decimal. Neste caso, no entanto, a faixa de valores que podem ser armazendos
na coluna salario é de -99.99 a 99.99. (MySQL pode, na verdade, armazenar numeros acima
de 999.99 neste campo porque ele não precisa armazenar o sinal para números positivos).
A faixa máxima dos valores DECIMAL e NUMERIC é o mesmo do DOUBLE, mas a faixa real
para um campo DECIMAL or NUMERIC pode ser limitado pela precisão ou pela escala para
uma dada coluna. Quando é atribuído a uma coluna um valor com mais digitos após o ponto
decimal do que o permitido especificado na escala, o valor é arredondado para aquela escala.
Quando é atribuido um valor a uma coluna DECIMAL ou NUMERIC o qual excede a faixa
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 18 de 71
determinada pelas precisão e escala especificada (ou padrão), MySQL armazena o valor
correspondente ao final daquela faixa.
Como uma extensão do padrão ANSI/ISO SQL92, MySQL também suporta os tipos integrais
TINYINT, MEDIUMINT, e BIGINT como listado nas tabelas abaixo. Outra extensão
suportada pelo MySQL é especificar, opcionalmente, o tamanho do display de um valor inteiro
entre parenteses seguindo o nome do tipo (por exemplo, INT(4)). Esta especificação opcional
do tamanho é usada para preenchimento a esquerda do display de valores cujo tamanho é
menor que o especificado para a coluna, mas não limita a faixa de valores que podem ser
armazendos na coluna, nem o número de dígitos que serão mostrados para valores que
excederem o tamanho especificado na coluna. Quando usados em conjunto com o atributo
opcional de extensão ZEROFILL, o padrão do preenchimento de espaços é a substituição por
zeros. Por exemplo, para uma coluna declarada com INT(5) ZEROFILL, o valor 4 é retornado
como 00004. Note que se você armazenar valores maiores que a largura do display em um
coluna do tipo inteiro, você pode ter problemas quando o MySQL gerar tabelas temporárias
para algum join complicado, já que nestes casos o MySQL acredita que os dados cabem na
largura original da coluna.
Todos os tipos inteiros podem ter um atributo opcional (não-padrão) UNSIGNED. Valores sem
sinal podem ser usados quando você permite apenas números positivos em uma coluna e você
precisa de uma faixa de valores um pouco maior para a coluna.
Desde o MySQL 4.0.2, tipos de ponto flutuante também podem ser sem sinal (UNSIGNED).
Como no tipos inteiros, este atributoprevine que valores negativos sejam armazenados na
coluna. Ao contrário dos tipos negativos, o valor máximo da faixa permitida permanece o
mesmo.
O tipo FLOAT é usado para representar tipos de dados numéricos aproximados. O padrão
SQL-92 permite uma especificação opcional da precisão (mas não da faixa do expoente) em
bits, após a a palavra FLOAT e entre parenteses. A implementação MySQL também suporta
esta especificação opcional de precisão. Quando FLOAT é usada para uma tipo de coluna sem
especificação de precisão, MySQL utiliza quatro bytes para armazenar os valores. Uma sintaxe
variante também é suportada, com dois numeros entre parenteses após a palavra FLOAT.
Com esta opção, o primeiro número continua a representar a quantidade de bytes necessária
para armazenar o valor, e o segundo número especifica o número de dígitos a serem
armazenados e mostrados após o ponto decimal (como com DECIMAL e NUMERIC). Quando
é pedido ao MySQL para armazenar um número em uma coluna com mais digitos decimais
após o ponto decimal que o especificado para esta coluna, o valor é arredondado eliminando
os digitos extras quando armazenado.
Os tipos REAL e DOUBLE PRECISION não aceitam especificações de precisão. Como uma
extensão do padrão SQL-92, o MySQL reconhece DOUBLE como um sinônimo para o tipo
DOUBLE PRECISION. Em constraste com a exigencia do padrão de que a precisão do tipo
REAL seja menor que aquele usado pelo DOUBLE PRECISION, MySQL implementa ambos
como valores de ponto flutuante de 8 bits de dupla precisão (quando não estiver executando
em ``modo ANSI''). Para uma portabilidade máxima, códigos que requerem armazenamento
de valores de dados numéricos aproximados usam FLOAT ou DOUBLE PRECISION sem
especificação de precisão ou de numeros decimais.
Quando solicitado a armazenar um valor em uma coluna numérica que está fora da faixa
permitida pelo tipo da coluna, o MySQL ajusta o valor ao limite da faixa permitida mais
apropriado e armazena este valor.
Por exemplo, a faixa de uma coluna INT é de -2147483648 a 2147483647. Se você tentar
inserir -9999999999 em uma coluna INT, o valor é ajustado para o limite mais baixo da
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 19 de 71
Se o campo INT é UNSIGNED, o tamanho da faixa do campo é o mesmo mas o limite passa a
ser de 0 a 4294967295. Se você tentar armazenar -9999999999 e 9999999999, os
valores armazenados na coluna serão 0 e 4294967296.
Conversões que ocorrem devido a ajustes são relatados como ``avisos'' para ALTER TABLE,
LOAD DATA INFILE, UPDATE, e instruções INSERT multi-registros.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The
original Reference Manual is in English, and this translation is not necessarily as up to date as
the English version.
2 Data:
Na hora de armazenar datas, há que ter em conta que MySQL não verifica de uma maneira
estricta se uma data é válida ou não. Simplesmente comprova que o mês está compreendido
entre 0 e 12 e que o dia está compreendido entre 0 e 31.
Date: tipo data, armazena uma data. A margem de valores vai desde o 1 de Janeiro de 1001
ao 31 de dezembro de 9999. O formato de armazenamento é de ano-mes-dia.
TimeStamp: Combinação de data e hora. A margem vai desde o 1 de Janeiro de 1970 ao ano
2037. O formato de armazenamento depende do tamanho do campo:
Time: armazena uma hora. A margem de horas vai desde -838 horas, 59 minutos e 59
segundos. O formato de armazenamento é 'HH:MM:SS'.
Year: armazena um ano. A margem de valores permitidos vai desde o ano 1901 ao ano 2155.
O campo pode ter tamanho dois ou tamanho 4 dependendo de se queremos armazenar o ano
com dois ou quatro algarismos.
3 Cadeia:
Char(n): armazena uma cadeia de longitude fixa. A cadeia poderá conter desde 0 até 255
caracteres.
VarChar(n): armazena uma cadeia de longitude variável. A cadeia poderá conter desde 0 até
255 caracteres. Dentro dos tipos de cadeia pode-se distinguir dois subtipos, os tipo Test e os
tipo Blob (Binary Large Object) A diferença entre um tipo e outro é o tratamento que recebem
na hora de ordená-los e compará-los. No tipo test ordena-se sem ter importância as
maiúsculas e as minúsculas e no tipo blob ordena-se tendo em conta as maiúsculas e
minúsculas.
Os tipos blob utilizam-se para armazenar dados binários como podem ser ficheiros.
Enum: campo que pode ter um único valor de uma lista que se especifica. O tipo Enum aceita
até 65535 valores diferentes.
Set: um campo que pode conter nenhum, um ou vários valores de uma lista. A lista pode ter
um máximo de 64 valores.
OBSERVAÇÕES:
as opções entre colchetes ( [ e ]) são opcionais;
dentre os tipos que se ajustam aos dados a serem inseridos, escolha sempre o de
menor tamanho;
para dados do tipo inteiro você pode usar a opção UNSIGNED para especificar inteiros
positivos ou zero;
M especifica o tamanho máximo de exibição;
D especifica o número de casas decimais. O valor máximo de D é 30 ou M-2;
tanto para números inteiros como para números de ponto flutuante você pode
especificar a opção ZEROFILL que preenche os números com zeros iniciais. Colunas
especificadas com ZEROFILL são automaticamente configuradas como UNSIGNED;
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 22 de 71
OBSERVAÇÕES:
Novamente podemos nos valer do parâmetro opcional IF NOT EXISTS para executarmos o
comando sem termos certeza da existencia ou não da tabela.
Para criarmos uma tabela bastaríamos executar a seguinte parte da síntese: CREATE TABLE
nome_tabela.
Mas é mais comum criarmos a tabela já acompanhada de seus campos (fields). Vejamos o
exemplo que cria a tabela filmes com os seguintes campos:
id - campo de identificação;
titulo - titulo do filme;
ano - Ano de produção;
diretor - diretor do filmes;
Para isto devemos executar o seguinte comando:
No campo id por exemplo o tipo é int(10) com o modificador unsigned, ele não aceita valores
nulos (not null) e é auto_increment, ou seja, seu valor é definido automaticamente,
aumentando de 1 (um) em 1 (um) toda vez que um novo registro é adicionado. Para fazer uso
desta funcionalidade é necessário adicionar o valor 0 ou null neste campo.
No campo titulo escolhemos o tipo varchar(80) o que significa que este campo aceita
caracteres alfanuméricos num máximo determinado por nós de 80. O campo também não
pode ser nulo.
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 25 de 71
Ambas as tabelas devem ser do tipo InnoDB, na tabela deve existir um índice onde as colunas
de chaves estrangeiras listadas como as PRIMEIRAS colunas e na tabela indicada deve haver
um índice onde as colunas indicadas são listadas como as PRIMEIRAS colunas e na mesma
ordem. O InnoDB não cria índices automaticamente em chaves estrangeiras para chaves
referênciadas: você tem que criá-las explicitamente. Os índices são necessários para
verificação de chaves estrangeiras para ser rápido e não exigir a varredura da tabela.
Colunas correspondentes nas chaves estrangeiras e a chave referenciada devem ter tipos de
dados internos parecidos dentro do InnoDB para que possam ser comparados sem uma
conversão de tipo. O tamanho e a sinalização de tipos inteiros devem ser o mesmo. O
tamanho do tipos string não precisam ser o mesmo. Se você especificar uma ação SET NULL,
esteja certo de que você não declarou as colunas na tabela filha como NOT NULL.
Se o MySQL retornar o erro de número 1005 de uma instrução CREATE TABLE, e a string de
mensagem de erro se referir ao errno 150, então a criação da tabela falhou porque um
restrição de chaves estrangeiras não foi formada corretamente. Similarmente, se uma ALTER
TABLE falhar e se referir ao errno 150, sgnifica que um definição de chave estrangeira foi
formada incorretamente na tabela alterada. A partir da versão 4.0.13, você pode usar SHOW
INNODB STATUS para ver uma explicação detalhada do ultimo erro de chave estrangeira do
InnoDB no servidor.
A partir de versão 3.23.50, InnoDB não verifica restrições de chaves estrangeiras naqueles
valores de chaves estrangeiras ou chaves referênciadas que contenham uma coluna NULL.
Um desvio do padrão SQL: se na tabela pai existirem diversos registros têm o mesmo valor
de chave referência, então o InnoDB atua na verificação da chave estrangeira como o outro
registro pai como se o mesmo valor de chave não existisse. Por exemplo, se você tiver
definido uma restrição de tipo RESTRICT, e existir um registro filho com diversos registros
pais, o InnoDB não permite a deleção de qualquer um dos registros pais.
A partir da versão 3.23.50, você também pode associar a cláusula ON DELETE CASCADE ou
ON DELETE SET NULL com a restrição de chave estrangeira. Opções correspondentes do ON
UPDATE estão disponíveis a partir da versão 4.0.8. Se ON DELETE CASCADE for
especificado, e um registro na tabela pai for deletado, então o InnoDB automaticamente
também deleta todos aqueles registros na tabela filha cujos valores de chaves estrangeiras são
iguais ao valor da chave referênciada no registro pai Se ON DELETE SET NULL for
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 26 de 71
Um desvio dos padrões SQL: se ON UPDATE CASCADE ou ON UPDATE SET NULL retornam
para atualizar a MESMA TABELA que ja tenha sido atualizada durante o processo cascata, ele
atua como RESTRICT. Isto é para prevenirloops infinitos resultantes de atualizações em
cascata. Um ON DELETE SET NULL auto referêncial, por outro lado, funciona desde a versão
4.0.13. ON DELETE CASCADE auto referêncial já está funcionando.
Um exemplo:
CREATE TABLE parent(id INT NOT NULL, PRIMARY KEY (id)) TYPE=INNODB;
CREATE TABLE child(id INT, parent_id INT, INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent(id)
ON DELETE SET NULL
) TYPE=INNODB;
Um exemplo complexo:
CREATE TABLE product (category INT NOT NULL, id INT NOT NULL,
price DECIMAL,
PRIMARY KEY(category, id)) TYPE=INNODB;
CREATE TABLE customer (id INT NOT NULL,
PRIMARY KEY (id)) TYPE=INNODB;
CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,
product_category INT NOT NULL,
product_id INT NOT NULL,
customer_id INT NOT NULL,
PRIMARY KEY(no),
INDEX (product_category, product_id),
FOREIGN KEY (product_category, product_id)
REFERENCES product(category, id)
ON UPDATE CASCADE ON DELETE RESTRICT,
INDEX (customer_id),
FOREIGN KEY (customer_id)
REFERENCES customer(id)) TYPE=INNODB;
A partir da versão 3.23.50 o InnoDB lhe permite adicionar novas restriçoões de chaves
estrangeiras a uma tabela.
Você tem que usar SHOW CREATE TABLE para daterminar as id's de chaves estrangeiras
geradas internamente quando você apaga uma chave estrangeira.
Na versão anterior a 3.23.50 do InnoDB, ALTER TABLE ou CREATE INDEX não devem ser
usadas em conexões com tabelas que têm restrições de chaves estrangeiras ou que são
referênciadas em restrições de chaves estrangeiras: Qualquer ALTER TABLE remove todas as
restrições de chaves estrangeiras definidas na tabela. Você não deve utilizar ALTER TABLE
para tabela referenciadas também, mas utilizar DROP TABLE e CREATE TABLE para modifcar
o esquema. Quando o MySQL faz um ALTER TABLE ele pode usar internamente RENAME
TABLE, e isto irá confundir a restrição de chave estrangeira que se refere a tabela. Uma
instrução CREATE INDEX é processada no MySQL como um ALTER TABLE, e estas restrições
também se aplicam a ele.
Se você quiser ignorar as restrições de chaves estrangeiras durante, por exemplo um operação
LOAD DATA, você pode fazer SET FOREIGN_KEY_CHECKS=0.
O InnoDB lhe permite apagar qualquer tabela mesmo que ela quebre a restrição de chaves
estrangeira que referencia a tabela. Ao apagar um tabela restrição que é definida na instrução
create também é apagada.
Se você recriar uma tabela que foi apagada, ela deve ter uma definição de acordo com a
restrição de chaves estrangeiras que faz referência a ela. Ela deve ter os nomes e tipos de
colunas corretor e deve ter os índices na chave referenciada como indicado acima. Se esta
condição não for satisfeita, o MySQL retornará o erro de número 1005 e se refere ao errno 150
na string de mensagem de erro.
A partir da versão 3.23.50 o InnoDB retorna da definição de chave estrangeira de uma tabela
quando você chama
Assim o MYSQLDUMP também produz as difinições de tabelas corretas no arquivo dump e não
se esquece das chaves estrangeiras.
Você também pode listar as restrições de chaves estrangeiras de uma tabela T com
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The
original Reference Manual is in English, and this translation is not necessarily as up to date as the
English version.
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 28 de 71
mysql>
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 29 de 71
mysql>
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 30 de 71
RETOMANDO A SESSÃO:
Setting environment for using XAMPP for Windows.
Agnello@PAVILION C:\Xampp
# cd mysql\bin
Agnello@PAVILION C:\Xampp\mysql\bin
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.37 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
Os índices são utilizados para encontrar registros com um valor específico de uma coluna
rapidamente. Sem um índice o MySQL tem de iniciar com o primeiro registro e depois ler
sequencialmente toda a tabela até que encontre os registros relevantes. Quanto maior a
tabela, maior será o custo. Se a tabela possuir um índice para as colunas em questão, o
MySQL poderá rapidamente obter uma posição para procurar no meio do arquivo de dados
sem ter que varrer todos os registros. Se uma tabela possui 1000 registros, isto é pelo menos
100 vezes mais rápido do que ler todos os registros sequencialmente. Note que se você
precisar acessar quase todos os 1000 registros, seria mais rápido acessá-los sequencialmente
porque evitaria múltiplos acessos ao disco.
Todos os índices do MySQL são armazenados e processados dentro da característica
denominada “árvore B” ou “árvore binária”. Strings são automaticamente compactadas nos
espaços finais e prefixados.
145270@SPASCHOAL_SFL C:\xampp
# cd mysql\bin
145270@SPASCHOAL_SFL C:\xampp\mysql\bin
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.1.37 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
+--------+---------------------------------+-----------+
| CodMat | NomeMat | ChMat |
+--------+---------------------------------+-----------+
| 1 | Modelagem e Analise Funcional | 40 |
| 2 | Analise e Modelagem de Dados | 40 |
| 3 | Analise e Modelagem de Process | 40 |
| 4 | Tecnicas de Programacao I | 40 |
| 5 | Tecnicas de Programacao II | 80 |
| 6 | Adm e Proj de Bco de Dados | 40 |
| 7 | Linguagem C - I | 40 |
| 8 | Linguagem C - II | 40 |
| 9 | Linguagem Java I | 80 |
| 10 | Linguagem Java II | 80 |
| 11 | Linguagem VB I | 40 |
| 12 | Linguagem VB II | 40 |
| 13 | Linguagem Delphi I | 40 |
| 14 | Linguagem Delphi II | 40 |
| 15 | Arquitetura de SW I | 80 |
| 101 | Elicitacao de Requisitos | 40 |
| 102 | Codificacao Assembler | 80 |
| 103 | Depuracao de Codigo | 120 |
| 104 | Estatistica Aplicada | 40 |
| 105 | Fisica Quantica | 120 |
| 106 | GestÒo de Projetos | 72 |
| 107 | Historia da Cibernetica | 40 |
| 108 | Inducao Estatica | 12 |
| 109 | Java Script | 40 |
| 110 | Logica Aplicada | 72 |
| 111 | monitoraþÒo de Ambientes | 120 |
+--------+---------------------------------+-----------+
26 rows in set (0.00 sec
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 40 de 71
+---------+---------------------+----------------+
| CodProf | NomeProf | TelProf |
+---------+---------------------+----------------+
| 1 | Antonio Pereira | (11) 8765-0880 |
| 2 | Antonio Ramos | (11) 8766-0880 |
| 3 | Carla Ramos | (11) 9766-2280 |
| 4 | Denise Goncalves | (11) 8136-1234 |
| 5 | Vitoria Ramos | (11) 6766-0812 |
| 6 | Sergio Agnello | (11) 9115-8616 |
| 7 | Joao da Silva Rusda | (11) 9264-0190 |
| 8 | Joao Carlos Pereira | (11) 2366-0880 |
| 9 | Maiara Alencar | (11) 9966-0890 |
| 10 | Marcia Bretao Silva | (11) 9343-8523 |
+---------+---------------------+----------------+
10 rows in set (0.00 sec)
mysql>
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 41 de 71
UPDATE é aplicado a uma tabela e a cláusula SET atribui a um campo o valor de uma
expressão que pode ou não conter o valor de um campo da própria tabela. A cláusula WHERE
restringe as atualizações apenas aos registro que satisfação suas condições.
A partir da MySQL Versão 4.0.4, você também pode realizar operações UPDATE que cobrem
múltiplas tabelas.
Exemplo:
UPDATE Alunos
Set NomeAlu = ‘Aluno Oito da Silva’,
Where MatricAlu = ‘123458’;
O comando DELETE é usado para apagar registros de uma tabela em um banco de dados.
Nota: Observe a cláusula WHERE na sintaxe do DELETE. A cláusula WHERE especifica que
registro ou registros devem ser apagados. Se você omitir a cláusula WHERE, todos os registros
serão excluídos!
Exemplo:
SELECT `mca` . *
FROM `mca`
LEFT JOIN `materias` ON `mca`.`CodMat` = `materias`.`CodMat`
WHERE `materias`.`CodMat` IS NULL
AND `mca`.`CodMat` IS NOT NULL
LIMIT 0 , 30
145270@SPASCHOAL_SFL C:\xampp
# CD MYSQL\BIN
145270@SPASCHOAL_SFL C:\xampp\mysql\bin
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 39
Server version: 5.1.37 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
Ao analisarmos o result table da última consulta, vamos perceber que o servidor MySql não
verificou se a integridade referencial da tabela MCA com Matérias e com Professores estava ou
não sendo agredida.
Se realizamos o projeto corretamente, procedendo a normalização como manda o figurino e o
Ted Codd ; - )) como foi que a coisa desandou desta forma?
A parte do texto a seguir foi produzida por Eber M. Duarte e publicada na internet
nas URL indicadas, assim como publicado na revista SQL Magazine. Procedi apenas
pequenas adaptações, sem ferir o conteúdo, visando nosso maior entendimento no contexto
do nosso estudo.
Texto extraído da internet nos endereços:
http://www.criarweb.com/artigos/674.php
http://forum.imasters.uol.com.br/index.php?/topic/100466-integridade-referencial-no-mysql/.
O MySQL possui uma característica um pouco diferente dos outros sistemas gerenciadores de
banco de dados, uma vez que no MySQL é possível escolher o tipo da tabela no momento da
criação da mesma. O formato de armazenamento dos dados, bem como alguns recursos do
banco de dados são dependentes do tipo de tabela escolhido. Vamos ver os tipos de tabelas
suportados pelo MySQL e as suas características.
A definição do tipo de tabela se dá por meio do comando CREATE TABLE, como mostrado a
seguir:
No comando acima, TYPE=MyISAM, indica que a tabela criada será do tipo MyISAM, que é o
valor default caso não seja informado o TYPE. A partir da versão 4.0.18 você pode utilizar
ENGINE como sinônimo de TYPE. A seguir estão apresentados os tipos de tabelas existentes
no MySQL:
1. MyISAM:
Este é o tipo de tabela padrão do MySQL. Caso não seja informado o tipo de tabela, o MySQL
criará a tabela do tipo MyISAM. O tipo de tabela default pode ser alterado incluindo-se no
arquivo de configuração, a opção descrita a seguir: default-table-type=tipo.
MyISAM não provê controle de transações (commit ou rollback) e também não possue
integridade referencial, isto é, ao incluir uma chave estrangeira com alguns constraints, esta
servirá apenas como documentação, mas as restrições não serão respeitadas pelo banco.
Como as tabelas MyISAM são representadas por arquivos no modelo uma tabela para três
arquivos, existe, em alguns sistemas operacionais, restrições quanto ao tamanho destas
tabelas. No Linux, por exemplo, existe a restrição de 2G/4GB por arquivo, com isto uma tabela
MyISAM poderia ter somente 2G/4GB de dados. Para superar esta limitação foi introduzido na
versão 4.1 a opção RAID_TYPE utilizada no CREATE TABLE, que permite ao próprio MySQL
dividir o armazenamento da tabela em vários arquivos. Com isto, o tamanho da tabela MyISAM
não fica preso ao tamanho máximo de arquivo do sistema operacional. O principal problema
encontrado com as tabelas MyISAM é que elas possuem um mecanismo de locks por tabela.
Assim, todas as vezes que há uma escrita na tabela, o MySQL precisa travar a tabela como um
todo, o que bloqueia por um instante o acesso à esta tabela, mesmo para processos que
tentem acessar registros que estão sendo modificados. Assim, é gerada uma fila de espera até
que o lock seja liberado e os outros processos possam ser executados. Por outro lado, estas
tabelas são extremamente rápidas, devido à sua arquitetura simplificada.
2. HEAP:
Tabelas HEAP são armazenadas em memória e por isto são extramente rápidas, por outro
lado o seu conteúdo é volátil, uma vez que não são gravadas em disco. Caso haja uma queda
do SGBD os dados destas tabelas serão perdidos. Além disto, é necessário um processo para
dar a carga inicial nos dados quando o servidor de banco iniciar e sua execução. A principal
aplicação das tabelas HEAP seria para tabelas que são consultadas com muita frequência, mas
que não sofrem muitas alterações (lookup tables).
3. MERGE:
As tabelas MERGE são coleções de tabelas MyISAM idênticas. Este recurso permite a divisão
de uma tabela grande em várias partes menores, e ainda assim permite acesso ao conteúdo
de todas elas como se fossem uma única tabela. O exemplo a seguir ilustra a criação de uma
tabela MERGE:
CREATE TABLE t1 (
a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
message CHAR(20) );
CREATE TABLE t2 (
a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
message CHAR(20) );
INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
CREATE TABLE total (
a INT NOT NULL AUTO_INCREMENT,
message CHAR(20), INDEX(a)
)TYPE=MERGE UNION=(t1,t2);
SELECT * FROM total;
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 45 de 71
a message
-----------------------
1 Testing
2 Table
3 t1
1 Testing
2 Table
3 t2
Percebam que as tabelas t1, t2 e total são idênticas e as duas primeiras são tabelas MyISAM
(foi omitido o TYPE no comando CREATE TABLE). Ao se submeter um SELECT na tabela total,
você tem acesso ao conteúdo das tabelas t1 e t2, simultaneamente. A principal vantagem da
tabela MERGE é permitir a divisão de tabelas grandes em tabelas pequenas, mais facilmente
gerenciadas. Também permite superar as limitações do sistema operacional em relação ao
tamanho de arquivos, uma vez que a tabela seria dividida em várias partes, onde cada parte
poderia atingir o tamanho máximo de arquivo. A desvantagem é que podemos fazer apenas
MERGE de tabelas MyISAM idênticas.
4. BDB:
5. InnoDB:
Integridade referencial, com implementação dos constraints SET NULL, SET DEFAULT,
RESTRICT e CASCADE;
Ferramenta de backup on-line (ferramenta comercial, não GPL);
Lock de registro, como Oracle, DB2, etc;
Níveis de isolamento;
Armazenamentos de dados em tablespace.
Por se tratar de um tipo de tabela com recursos mais avançados, requer mais espaço em
memória e disco, além de se apresentar, em determinadas situações, um pouco mais lento
que MyISAM. Apesar disto, o InnoDB tem se mostrado extremamente rápido se comparado
com outros SGBDs transacionais.
A vantagem da utilização de tipos de tabela é que você poderá optar por utilizar um
determinado tipo ou outro dependendo dos requisitos exigidos pela sua aplicação. Por
exemplo, se a sua aplicação é apenas de consulta você pode optar pelo tipo MyISAM em vez
do InnoDB, com isto você evita o overhead da transação, obtendo um maior desempenho. É
importante lembrar que você poderá utilizar vários tipos de tabelas em um mesmo
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 46 de 71
banco de dados. Neste caso, deve-se tomar cuidado com a utilização de determinados
recursos, por exemplo, se você tiver uma transação envolvendo tabelas InnoDB e MyISAM e
você submeter um comando ROLLBACK, apenas os comandos executados no InnoDB serão
desfeitos, enquanto que os comandos executados no MyISAM persistirão. A utilização do tipo
de tabela correto é um fator chave para determinar o desempenho da sua aplicação.
No exemplo existem 3 tabelas: aluno, que armazena os alunos de uma faculdade; a tabela
cursos que contém as disciplinas ministradas e a tabela notas com os pontos dos alunos em
todos os cursos freqüentados por eles. No modelo é possível que um curso possua várias
avaliações em datas distintas. Neste caso, foram criadas as tabelas como tipo InnoDB
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 47 de 71
É importante ressaltar que o FOREIGN KEY não cria automaticamente um índice na(s)
coluna(s) referenciada(s). Assim, é necessário criar explicitamente um índice nas colunas que
serão chaves estrangeiras. No exemplo, a coluna aluno_id já é um índice, visto que esta é o
primeiro campo da chave primária da tabela. Como cursos_id não é o primeiro campo de
nenhuma chave, foi adicionado o índice i2 para esta chave estrangeira. Caso não seja criado o
índice nas chaves estrangeiras, o MySQL exibirá o erro "ERROR 1005: Can't create table
'./test/notas.frm' (errno: 150)", onde o erro significa que há uma definição incorreta das
chaves estrangeiras.
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 48 de 71
Imaginemos a seguinte situação: uma tabela com dados de várias empresas e outra tabela
guardando os dados dos funcionários dessas empresas. Cada tabela, como não poderia ser
diferente, contém os dados específicos de sua classe de informação, ou seja, a tabela
Empresas armazena Nome, Endereço, CNPJ, entre outros dados das Empresas. A tabela
Funcionários armazena Nome, Endereço, Telefone, CPF e os demais dados de Funcionários.
Ao analisarmos a relação entre estas tabelas, encontraremos: Uma (1) Empresa pode ter
muitos (N) Funcionários, e um (1) Funcionário trabalha para uma única Empresa, em um
momento específico. Ou seja, a relação pode ser representada graficamente da seguinte
forma:
POSSUI
1 N
EMPRESAS FUNCIONÁRIOS
1 TRABALHA
1
O que resulta :
1 N
EMPRESAS FUNCIONÁRIOS
Agora vamos abstrair: O estabelecimento da relação se dá pela criação da chave de uma das
tabelas relacionadas na outra tabela. Na relação funcionário - um para uma – empresa é
possível colocarmos na tabela funcionário o código da empresa para qual trabalha. Já com
relação a empresa – uma para muitos funcionários, não dá para inserirmos o código de
funcionário na tabela de empresas, pois se podemos ter mais de um funcionário por empresa,
quantas colunas (uma para cada possível funcionário) necessitaríamos reservar? Não
obteríamos um número sem estabelecermos um limite para essa relação, o que na vida
prática, convenhamos, não parece ser uma prática louvável, não é mesmo?
Como estamos observando pelo funcionário, então a gente fala de um campo na tabela
funcionários. Bastaria, para resolver o problema de relações, acrescentar um campo na tabela
funcionário para dizer a que empresa ele pertence.
Mas se observarmos pela lado da empresa, temos a relação de um para muitos (uma empresa
para muitos funcionários) ou, se em algum caso enxergarmos uma relação muitos para
muitos, então precisaremos de uma tabela intermediária.
Vamos ver na prática, como funciona: Vamos imaginar utro caso onde teríamos uma tabela de
empresas e uma tabela de categorias. Uma empresa pode ter mais de uma categoria, ou seja
uma relação de um para muitos. Por outro lado, uma categoria pode estar associada a diversas
empresas. Desta forma, obteríamos a relação de muitos para muitos. A solução para este
relacionamento (N para M) é criarmos uma tabela intermediária para resolver nosso problema.
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 49 de 71
A tabela intermediária estabeleceria a relação muitos para muitos que necessitamos para
fechar a relação. Vamos nomeá-la EmpreCat, mas poderíamos colocar qualquer outro nome
que entendêssemos representar adequadamente esta combinação. EmpreCat contaria com os
seguintes campos:
- CodEmpresa
- CodCategoria
Ambos os campos seriam chave, para que nunca existisse duplicidade no cadastro de uma
mesma empresa para uma mesma categoria. E, além disto, cada coluna, individualmente,
seria uma chave estrangeira.
+--------------+------------------+
| CodEmpresa | NomeEmpresa |
+--------------+------------------+
| 4 | Empresa X |
+--------------+------------------+
Para corrigir isto, deveríamos associar à chave estrangeira uma restrição (constraint) dizendo
que, no evento “ao apagar” (Delete) o registro na tabela Pai (Empresas), os registros filhos
associados na tabela filho (EmpreCat) deveriam também ser apagados. Este processo chama-
se apagar em cascata (cascade). Ou então, ao invés de apagar em cascata, poderíamos
associar ao evento ON DELETE a ação de fazer com que os registros filhos ficassem com
conteúdo nulo, ou algumas outras ações. Para fazer a ação apagar em cascata associada ao
evento ON DELETE, deveremos escrever o comando Create Table da seguinte forma:
Quando criamos um relacionamento explícito em uma tabela, utilizando chave estrangeira, isto
será útil para criarmos o que chamamos de índices. Os índices são uma forma de se percorrer
a tabela utilizando um campo específico, além daquele que é chave primária. Isto agiliza a
consulta, de forma que quando criamos chaves estrangeiras indexadas, o relacionamento entre
tabelas faz com que uma busca relacionada seja praticamente buscar em uma única tabela.
No entanto, para fazermos uma consulta relacionando tabelas, não é imprescindível existir o
relacionamento explícito. Veja o exemplo:
Uma tabela "Empresas", uma tabela "Categorias" e uma tabela "EmpreCat". Vimos como
criaríamos a tabela "EmpreCat" colocando uma chave estrangeira. Mas não dissemos como
criaríamos o índice. Portanto, vamos a ele:
Bem, desta forma, ainda temos a conveniência de que, quando deletarmos qualquer registro na
tabela pai (Empresas, por exemplo), todos os registros da tabela filho associados àquele também
serão apagados. Mas o principal do relacionamento explícito não é isto. É que o banco de dados
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 51 de 71
SABE realmente da existência da relação entre estas tabelas. Portanto, ele sabe que as tabelas
"Empresas" e "Categorias" são as tabelas-pai da tabela "EmpreCat". Desta forma, o banco NÃO
PERMITE que venhamos inserir, na tabela filho, um registro com, por exemplo, um ID de uma
empresa que não está cadastrada na tabela "Empresas". Nem um registro com um ID de uma
categoria que não está cadastrado na tabela "Categorias". Isto que é um relacionamento definido!
Assim, o que realmente precisamos dizer é que não precisa existir chave estrangeira entre tabelas ou
um relacionamento concretamente estruturado para que consigamos fazer referências. As buscas só
não serão indexadas, mas isto nem será problema, também, pq os índices só começam a ajudar
quando a tabela começa a ficar grande (para o MySql, começar a perder performance precisamos de
uma tabela com mais de 5.000 registros, por exemplo).
Acho que agora é possível entendermos que não é questão do que é melhor entre JOIN e
relacionamento. Sempre tem que existir o JOIN. Tendo ou não relacionamento explícito entre
tabelas, na hora de consultar, precisararemos usar o JOIN.
Entenda que JOIN não é só INNER JOIN. Existem LEFT JOIN, INNER JOIN e RIGHT JOIN. E
que existem duas formas de se fazer JOIN: a que os bancos chamam de "the old JOIN style" e a que
os bancos chamam de "new JOIN style". Ou seja, antigo estilo de JOIN e novo estilo de JOIN. No
antigo, não usamos a palavra JOIN. Veja este exemplo de consulta que nos mostra todas as
categorias (não o ID, mas o nome da categoria) de determinada empresa:
SELECT
b.NomeCategoria
FROM
EmpreCat AS a,
Categorias AS b
WHERE
a.CodCategoria = b.CodCategoria AND
a.CodEmpresa = 3
ORDER BY b.NomeCategoria
Este é o velho estilo de JOIN. Colocamos nele, a cláusula WHERE, a qual é a relação entre a tabela
"a" e a tabela "b". A propósito... Este AS é, sim, o tal "alias" de tabela. "Alias" é a forma que o SQL
oferece para darmos um outro nome, (chamamos de apelido) para uma tabela. Isto simplifica
consultas pra não termos que ficar escrevendo um nome extenso da tabela ao associarmos qual
coluna desta tabela queremos referenciar. Para esta consulta de cima, se não usássemos "alias", veja
como ficaria:
SELECT
Categorias.NomeCategoria
FROM
EmpreCat,
Categorias
WHERE
EmpreCat.CodCategoria = Categorias.CodCategoria AND
EmpreCat.CodEmpresa = 3
ORDER BY Categorias.NomeCategoria;
Isto porque estamos usando somente um JOIN e buscando somente um campo. Imagine se fossem
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 52 de 71
Bem... Para o novo estilo de JOIN, a consulta acima ficaria deste jeito:
SELECT
b.categoria
FROM
EmpreCat AS a LEFT JOIN Categorias AS b ON (a.categoria_id=b.categoria_id)
WHERE a.CodEmpresa = 3
ORDER BY b.categoria;
Bem... E quanto à forma em que uma Junção ocorre? Avaliamos, até aqui, as Junções
denominadas Internas ou INNER JOIN. INNER é o default ou padrão de compra
estabelecido. Utilisamos a consulta LEFT JOIN. Existem diferenças, é claro? Mas neste
caso, as duas consultorias funcionariam, embora o mais "correto" (quando desejamos ver o
conceito dos dois, verá isto) para este caso seria o LEFT JOIN.
Então, criamos um relacionamento com innodb que já está criando uma integridade
referencial, o resto é você acrescentar tipo assim:
nesse exemplo ele atualiaza automaticamente uma chave estrangeira se o campo for editado
e nao deixa apagar o efeito cascade é modo cascata onde todas tabelas serao atualizadas
automaticamente
nesse exemplo quando deletar um campo todos os campos relacionados serao apagados
automaticamente
e por ai vai antes de usar precisa estudar e ver uma modelagem perfeita
olha nao recomendo você usar phpmyadmin se você quer mesmo criar um banco descente
eu faço no notepad
mas no phpmyadmin se você usar chaves e banco innodb ele deixa você setar as referencias
e efeitos cascades etc...
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 53 de 71
FUNÇÔES
O MySQL possui algumas funções que podem ser muito úteis no processamento dos dados.
Abaixo podemos ver uma tabela com algumas destas funções:
AVG(coluna)
COUNT(item)
Se item for uma coluna, será retornado a quantidade de valores não NULL nesta coluna.
MIN(coluna)
MAX(coluna)
SDT(coluna)
SDTDEV(coluna)
SUM(coluna)
Podemos usar a cláusula group by para calcular a média de pedidos para cada elemento de um
grupo determinado. Exemplo:
Observe que quando usamos group by a função avg() retorna a média calculada para cada
componente do grupo especificado, no caso "cliente".
Note que a cláusula having usada aqui tem o mesmo significado que where nas consultas
normais.
mysql>
C3 C2 C1
PRATOS ESPECIAIS - PEs RESTAURANTES CHEFES
C3 C1
RESTPCS PRATOS COMUNS - PCs
Criar um Banco de Dados de nome BDREST e depois criar as tabelas Restaurantes, Pratos
Especiais, Pratos Comuns e Chefes, objetivando a integridade referencial e com as
características abaixo:
C1
CHEFES (Responsáveis por Restaurantes)
IdChef Numérico INT(7) sem sinal – PK
NomeChef Texto(40) não nulo,
NívelChef Numérico INT(1) – Variando de 1 a 5 – sem sinal - não nulo – default “1”,
TelChef Numérico BIGINT(10) sem sinal,
ODChef Texto(100)
C2
RESTAURANTES
IdR Numérico INT(7) sem sinal – não nulo – PK
NomeR Texto (40) não nulo,
EnderR Texto(50),
NivelR Numérico INT(1) – Variando de 1 a 5 – sem sinal - não nulo – default “1”,
IdChef Numérico INT(7) sem sinal - FK.
C3
PRATOS ESPECIAIS – PEs
IdPE Numérico INT(3) sem sinal – não nulo – PK
NomePE Texto(40) não nulo,
DescrPE Texto(100),
NívelPE Numérico INT(1) – Variando de 1 a 5 – sem sinal - não nulo – default “1”,
ValorPE Numérico com 2 decimais, sem sinal,
IdRPE Numérico INT(7) sem sinal – FK,
DataLctoPE Date
RESTPCS
IdRPC Numérico INT(7) sem sinal – não nulo – PK e FK isoladamente
IdPCR Numérico INT(3) sem sinal - não nulo - PK e FK isoladamente
DiferençasRPC Texto (100),
ValorPPC Numérico com 2 decimais, sem sinal,
NivelRPC Numérico INT(1) – Variando de 1 a 5 – sem sinal - não nulo – default “1”,
145270@SPASCHOAL_SFL C:\xampp
# cd mysql\bin
145270@SPASCHOAL_SFL C:\xampp\mysql\bin
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 132
Server version: 5.1.37 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
CRIANDO AS TABELAS C1
Criar a tabela Chefes - C1
mysql> Create table CHEFES (
-> IdChef int(7) unsigned,
-> NomeChef char(40),
-> NivelChef enum('1', '2', '3', '4', '5') default '1',
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 58 de 71
mysql>
NomeR NomePE
Restaurante Frangão 101 Macarrão Tomato
Restaurante Macarrão 102 Polentina Xpecial
Restaurante Macarrão 102 Arroz com Amendoas
Resultado SQL
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 61 de 71
Chefe1 Chefe2
Chefe 101 Chefe 102
Chefe 101 Chefe 103
Chefe 102 Chefe 103
Chefe 101 Chefe 104
Chefe 102 Chefe 104
Chefe 103 Chefe 104
Chefe 101 Chefe 105
Chefe 102 Chefe 105
Chefe 103 Chefe 105
Chefe 104 Chefe 105
Registros: 2
NOMER NOMEPC DATALCTOPC
Restaurante Frangão 101 Arroz com feijão preto 2009-04-01
Restaurante Macarrão 102 Arroz com feijão preto 2009-04-01
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 62 de 71
2a. Tentativa
Selecionando os iguais:
SELECT NomeR, NomePE
From Restaurantes inner join PEs
on IdRPE = IdR;
Registros: 1
NomeR NomePE
Restaurante Macarrão 102 Polentina Xpecial
Registros: 2
NomeR NomePE
Restaurante Frangão 101 NULL
Restaurante Macarrão 102 Polentina Xpecial
3 - Liste todos os restaurantes e seus respectivos PEs cujo preço é maior que
o preço médio de todos os PEs (ValorPE).
parameter:
[ IN | OUT | INOUT ] param_name type
type:
Any valid MySQL data type
characteristic:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| SQL SECURITY {DEFINER | INVOKER}
| COMMENT string
routine_body:
Valid SQL procedure statement(s)
A cláusula RETURNS pode ser especificada apenas por uma FUNCTION. É usada para indicar o
tipo de retorno da função, e o corpo da função deve conter uma instrução RETURN value.
A lista de parâmetros entre parenteses deve estar sempre presente. Se não houver
parâmetros, uma lista de parâmetros vazia de () deve ser usada. Cada parâmetro é um
parâmetro IN por padrão. Para especificar outro tipo de parâmetro, use a palavra chave OUT
ou INOUT antes do nome do parâmetro. Especificar IN, OUT ou INOUT só é valido para uma
PROCEDURE.
A instrução CREATE FUNCTION é usada em versão novas do MySQL para suporte a UDFs (User
Defined Functions - Funções Definidas pelo Usuário). See Secção 14.2, “Adicionando Novas
Funções ao MySQL”. As UDFs continuam a ser suportadas, mesmo com a existencia de stored
functions. Uma UDF pode ser considerada como uma stored function externa. No entanto, note
que stored functions compartilham os seus namespace com as UDFs.
Um framework para stored procedures externas serão introduzidas em um futuro próxima. Isto
permitirá que você escreva stored procedures em outras linguagens além de SQL.
Provavelmente, uma das primeiras linguagens a ser suportada sea PHP, já que o mecanismo
do PHP é pequeno, seguro com threads e pode facilmente ser embutido. Como o framework
será publico, é esperado que muitas outras linguagens também sejam suportadas.
Uma função é considerada ``deterministica'' se ela sempre retorna o mesmo resultado para os
mesmos parâmetros de entrada, e ``não deterministica'' caso contrário. O otimizado pode
usar este fato. Atualmente, a característica DETERMINISTIC é aceita, mas ainda não é usada.
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 69 de 71
A característica SQL SECURITY pode ser usada para especificar se a rotina deve ser executada
usando as permissões do usuário que criou a rotina, ou o usuário que a chamou. O valor
padrão é DEFINER. Este recurso é novo no SQL:2003.
O MySQL ainda não usa o privilégio GRANT EXECUTE. Assim ,por enquanto, se um
procedimento p1() chama a tabela t1,o usuário deve ter privilégios na tabela t1 para chamar o
procedimento p1() com sucesso.
MySQL stores the SQL_MODE settings in effect at the time a routine is created, and will always
execute routines with these settings in force.
A cláusula COMMENT é uma extensão do MySQL, e pode ser usada para descrever o stored
procedure. Esta informação é exibida pelas instruções SHOW CREATE PROCEDURE e SHOW
CREATE FUNCTION.
O MySQL permite rotinas contendo instruções DDL (como CREATE e DROP) e instruções de
transação SQL (como COMMIT). Isto não é exigido por padrão e depende de especificações de
implementação.
NOTA: Atualmente, stored FUNCTIONs não podem conter referências às tabelas. Note que isto
inclui algumas instruções SET, mas exclui algumas instruções SELECT. Esta limitação será
retirada assim que possível.
A seguir temos um exemplo de uma stored procedure simples que usa um parâmetro OUT. O
exemplo usa o comando delimiter do cliente mysql para alterar o delimitador de instrução para
antes da definição do procedure. Isto permite que o delimitador ‘;’ usado no corpo de
procedure seja passado para o servidor em vez de ser interpretado pelo mysql.
mysql> delimiter |
A seguir esta um exemplo de uma função que utiliza um parametro, realiza uma operação
usando uma função SQL e retorna o resultado:
DISCIPLINA: ADMINISTRAÇÃO DE BANCOS DE DADOS
Prof. Sérgio AGNELLO Pág. 70 de 71
mysql> delimiter |
NomeR ValorPE
Restaurante Macarrão 102 55.00
Restaurante Frangão 101 79.00
Restaurante Bandeirantes 58.00
select nomer, valorpe, (select avg(valorpe)from pes where idrpe = idr) 'Valor Médio'
from restaurantes inner join pes
on idr = idrpe
order by idr;
Registros: 5