Criando, eliminando e modificando tabelas

Documentos relacionados
Banco de Dados I Introdução SQL

Tabelas. Banco de Dados I MySQL

A linguagem SQL

Professor Leonardo Larback

SQL Básica DDL. Prof. Marcos A. Schreiner. 21 de outubro de Curso de Licenciatura em Computação

MySql. Introdução a MySQL. Andréa Garcia Trindade

Banco de dados. Conteúdo: DDL Prof. Patrícia Lucas

SQL Linguagem de Definição de Dados

Sumário. SQL - Criação de Tabelas. Structured Query Language. SQL Versões. André Restivo. October 18, 2010

BANCO DE DADOS. Para a criação de um banco de dados, através de scripts SQL, deve-se usar a seguinte sintaxe: CREATE DATABASE <nome_banco_de_dados>

Banco de Dados. Professora: Luciana Faria

DDL DML DCL DTL Tipos Numéricos: INT FLOAT DOUBLE Tipos String: CHAR VARCHAR BINARY BLOB TEXT Tipos Data e Hora: DATE TIME TIMESTAMP YEAR

BCD29008 Banco de dados

Múltiplas Tabelas. Disciplina de Banco de Dados

Aula 6 BD1 Modelo Relacional. Profa. Elaine Faria UFU

Linguagem SQL Restrições, Triggers e Views

SQL. Linguagem de Definição de Dados (DDL) Tipos em SQL. Tipos Data/Tempo em SQL (cont.)

PSI Linguagem de Definição de dados. Módulo 15

SQL CREATE DATABASE. MySQL, SQL Server, Access, Oracle, Sybase, DB2, e outras base de dados utilizam o SQL.

SQL Básica. Andre Noel

Introdução ao PostgreSQL

Utilizando o Postgres - comandos SQL para a manipulação de dados

Bases de Dados. DDL Data Definition Language

MODELAGEM DE DADOS -INTRODUÇÃO AO SQL. Prof. Angelo Augusto Frozza, M.Sc.

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO RIO GRANDE DO NORTE INTRODUÇÃO A SQL

Bancos (Bases) de Dados

Instrução Create Table

Manipulação de Dados com SQL

SQL Linguagem de Definição de Dados. Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

'%'! $!0" $ 8 ' %%! % '! $ $$% + ' %!%$/)!'4!+,"/)!)+,/)% *! +,"0''% * %$!*!$$ #!"%&%'%'%$! "94(# ' %'$%$$$%0%$%' *!% %%%'!**% > %% %%!31?

Modelo Relacional Prof. Msc Denival A. dos Santos

LINGUAGEM SQL Linguagem usada em SGBD para: Definir estrutura de dados; Modificar dados em um banco de dados; Especificar restrições de segurança; Rea

BANCO DE DADOS GERENCIAL 1 A U L A 2

Banco de Dados. Linguagem SQL

Aula 06 Sistemas Embarcados LT38C

AULA 8. Ambientes Visuais 8.1. OBJETIVO DA AULA SQL (Structured Query Language)

A linguagem SQL

Mysql. Quanto mais informações você busca, mais você evolui. Vitor Ramos. Disciplina de Banco de Dados

modelo introduzido por E. F. Codd Meados da década de 70: protótipos. INGRES (UC Berkeley, 73 77) System R (IBM Research at San Jose, 74 78)

MYSQL - PRIMEIROS COMANDOS CRIAÇÃCO DO BD E DAS TABELAS, INSERÇÃO E CONSULTA DE REGISTROS. create database [if not exists] <nome>

PCS3413. Engenharia de So-ware e Banco de Dados. Aula 16. Escola Politécnica da Universidade de São Paulo

Administração de Banco de Dados

Rápida revisão do Modelo Relacional

INDEX. Serve para organizar os dados e agilizar a pesquisa/consulta dos dados armazenado nas tabelas.

Oracle Database 10g: Fundamentos de SQL e PL/SQL

SQL BÁSICO. Luiz Antônio Vivacqua Corrêa Meyer

Atualização e Inserção de Dados. SQL Avançado. Pedro F. Carvalho OCP Oracle g

O modelo relacional encontra-se padronizado pela indústria de informática. Ele é chamado de

Escola Secundária de Albufeira. Comandos MySQL. (Páginas Web Dinâmicas: PHP e MySQL) Carlos Nunes

Conceitos de Modelo Relacional Restrições de um Banco de Dados

saída durante o runtime Usando Functions de uma Única Linha para Personalizar Relatórios Mostrar as diferenças entre as functions SQL de uma única

Teste Exemplo Revisão da tentativa 1

Revisão de Bancos de Dados

Laboratório de Banco de Dados. Prof. Luiz Vivacqua.

Material Teórico. Organização de Dados. Responsável pelo Conteúdo: Prof. Ms. Alexander Gobbato Albuquerque

MODELO DE BANCO DE DADOS RELACIONAL

Conceito de Campos e Tabelas

BANCO DE DADOS II Prof. Ricardo Rodrigues Barcelar

SQL (Tópicos) Structured Query Language

Modelagem Física e SQL

Linguagem de Consulta Estruturada (SQL)

ORACLE 11 G INTRODUÇÃO AO ORACLE, SQL,PL/SQL

Importar e Exportar Dados

Modelagem Física e SQL

Modelo Relacional + SQL (DDL) Material elaborado pela Prof. Karin Becker

Revisando Banco de Dados. Modelo Relacional

conteúdos. bases de dados, SGBD e aplicações. conceitos. modelo relacional (DER) conceitos

BCD29008 Banco de dados

Conceitos SQL SQL 19/03/2017 O que é dado? O que é BD? O que é uma informação? O que é SGBD? O que é SQL? O que é BD? O que é SGBD?

A Linguagem SQL. Tecnologia de Base de Dados. MSc. Eugénio. Macumbe

Tarefa Orientada 8 Criação de tabelas

MATA60 BANCO DE DADOS Aula 10- Indexação. Prof. Daniela Barreiro Claro

FACULDADE INGÁ Unidade de Ensino Superior Ingá Ltda Ciência da Computação TRIGGERS. Prof. Erinaldo Sanches Nascimento

Aula de SQL Comandos DDL. André Luiz de Oliveira Eduardo Raul Hruschka

TLBD II. Continuação

BANCO DE DADOS WEB AULA 7. criação de tabelas. professor Luciano Roberto Rocha.

Comandos DDL. id_modulo = id_m odulo

SQL PostgreSQL. I Criação de Tabelas. Disciplina: SCC0241 Bases de Dados Professor: Eduardo Hruschka Estagiária PAE: Dayse de Almeida

Sistemas de Informação e Bases de Dados 2012/2013. Restrições de Integridade em SQL

Definição de Dados com SQL

INTRODUÇÃO AO MYSQL PROF. ME. HÉLIO ESPERIDIÃO

INSERT INTO shop VALUES (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69), (3,'D',1.25),(4,'D',19.95);

UNIVERSIDADE FEDERAL DA GRANDE DOURADOS PRÓ-REITORIA DE GRADUAÇÃO PROGRAD FACULDADE DE CIÊNCIAS EXATAS E TECNOLOGIA CURSO DE SISTEMAS DE INFORMAÇÃO

SQL Linguagem de Definição de Dados. Laboratório de Bases de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

BANCO DE DADOS PARA NINJAS

Algoritmos e Programação

Exemplos de Vistas SQL. Tipos em SQL. Linguagem de Definição de Dados (DDL) CREATE VIEW todososclientes As


Manipulando a base de dados

Subsistema de Integridade Semântica

Restrições do modelo relacional

Oracle Database 11g: Introdução à Linguagem SQL Novo

Linguagem de Definição de Dados (DDL)

Prof. Dr. Joaquim Assunção Banco de Dados. SQL (parte 4) DDL Restrições

SQL. SQL (Structured Query Language) Comando CREATE TABLE. SQL é uma linguagem de consulta que possibilita:

Sistemas de Informação e Bases de Dados 2012/2013. Linguagem SQL

Instituto Federal de Educação, Ciência e Tecnologia de São Paulo - IFSP

SISTEMAS DE INFORMAÇÃO

Transcrição:

Capítulo 11 Criando, eliminando e modificando tabelas Bancos de dados relacionais baseiam-se em tabelas. Cada tabela tem suas características próprias, como as colunas que a compõem, os identificadores e as restrições de integridade que devem ser respeitadas. Tabelas têm elos lógicos entre si que possibilitam a criação de complexos modelos, sobre os quais os mais variados tipos de aplicações podem ser construídas. Tudo isso é parte do arcabouço descritivo de um banco de dados. Através da estrutura de tabelas e das restrições impostas, determina-se o quê esse banco de dados pode aceitar. Pode-se pensar nisso como uma definição lógica, onde ficam estabelecidas as regras do jogo. Tabelas têm instâncias, constituídas pelos registros nelas armazenados. Usuários alimentam suas bases de dados manipulando esses registros, seja incluindo-os, removendo-os ou alterando seus valores. Essas operações ocorrem, sempre, dentro das regras definidas. Eventualmente essas regras podem mudar, visto que um banco de dados pode ter sua definição lógica revista. Este capítulo trata da definição das tabelas e das regras de uma base de dados. Os comandos aqui apresentados servem para criar, alterar e eliminar tabelas, além de definir os relacionamentos entre elas. A manipulação das instâncias das tabelas, via operações sobre registros, é vista no capítulo 12. As definições de um banco de dados usualmente fazem parte das tarefas do administrador DataBase Administrator e não estão acessíveis ao universo de usuários por vários motivos, segurança entre eles. Esse trabalho, normalmente, é efetuado através de interfaces especializadas, do tipo point & click, ficando bastante facilitado em comparação com a codificação textual. Mesmo assim, conhecer os comandos SQL é importante para administradores e usuários avançados. 11.1 CRIANDO TABELAS Para criar uma tabela num banco de dados relacional, é preciso definir e descrever seus diversos elementos componentes. Os principais aspectos que caracterizam uma tabela relacional são listados a seguir. Nome da tabela cada tabela tem um nome que a identifica; Atributos das tabelas, sendo que cada atributo pode ter Tipo e tamanho, que regem os valores que o mesmo pode assumir; Valor default, que é o valor padrão do atributo quando um novo registro é criado; Permissão para valores nulos, sobre a aceitação de valores nulos ou não; Autonumeração, que possibilita a geração automática de valores; Chave primária uma tabela pode ter, opcionalmente, um conjunto de um ou mais atributos que constituem um identificador único; Restrições de valores

210 Capítulo 11: Criando, eliminando e modificando tabelas uma tabela pode ter, opcionalmente, uma ou mais regras de aceitação de registros. Essas regras são estabelecidas sobre os valores dos seus atributos e são verificadas sempre que um registro é incluído ou alterado. Chaves candidatas um conjunto de um ou mais atributos pode constituir um identificador único para a tabela. Uma tabela pode ter zero ou mais chaves candidatas; Chaves estrangeiras um conjunto de um ou mais atributos pode constituir uma chave estrangeira. Uma tabela pode ter zero ou mais chaves estrangeiras. Na sua forma mais simples, uma tabela tem um nome e uma lista de atributos, cada um com seu tipo. Assim, um comando que crie uma tabela deve conter, no mínimo, esses elementos, como nos trechos abaixo. create table curso codcurso char 3, curso varchar 40 create table aluno create table aluno matricula int, matricula int, nome varchar 40, nome varchar 40, sexo char 1, sexo char 1, codcurso char 3, codcurso char 3, nascimento datetime nascimento date create table professor codprofessor int, professor varchar 40 create table disciplina coddisciplina int, disciplina varchar 40, codprofessor int, chst float, chsp float create table inscricao matricula int, coddisciplina int, nota float Os comandos create table, acima, criam versões simplificadas das tabelas do nosso banco e- xemplo 1. A tabela CURSO tem dois atributos, dos tipos char e varchar, o primeiro de 3 caracteres e o segundo com tamanho máximo de 40 caracteres. A segunda tabela, ALUNO, possui cinco atributos, sendo o último do tipo datetime. É claro que, normalmente, as tabelas em bancos de dados são um pouco mais complicadas do que isso; ainda não há chaves primárias, chaves estrangeiras, restrições de integridade e outras características pertinentes ao nosso modelo. 1 Nossa escolha limitou-se aos tipos de dados presentes nas quatro implementações SQL aqui utilizadas, com exceção para o tipo datetime que não está disponível no Oracle. Sem esta restrição, é possível fazer melhores escolhas para cada implementação específica.

Declarando as características de uma tabela 211 11.2 DECLARANDO AS CARACTERÍSTICAS DE UMA TABELA Os gerenciadores de bancos de dados requerem o estabelecimento de diversas características para as tabelas. Algumas delas são de ordem lógica, tal como o número de colunas e seus tipos, a chave primária ou restrições de valores. Outras características, entretanto, são de ordem operacional e, portanto, peculiares de cada implementação. Por exemplo, pode-se designar o espaço de armazenagem em disco para a tabela, ou estabelecer outros parâmetros específicos que extrapolam os aspectos clássicos do modelo relacional. Esta seção aborda as características de ordem geral de uma tabela relacional. Aspectos específicos serão abordados separadamente, nas seções dedicadas às implementações SQL. ESCOLHA DOS TIPOS A escolha de tipos adequados para os atributos, de acordo com os possíveis valores que os mesmos venham a assumir, é uma etapa extremamente importante no projeto de bancos de dados. Escolhas precipitadas e não plenamente fundamentadas podem resultar em custosos e demorados processos de reconfiguração mais adiante, que devem ser evitados. Os principais fatores que influenciam a escolha do tipo de um atributo são: os possíveis valores que esse atributo pode assumir; as prováveis operações a serem efetuadas com esse atributo; o espaço de armazenagem que cada tipo demanda. O capítulo 7 apresenta uma detalhada exposição dos tipos disponíveis nos diversos gerenciadores de bases de dados analisadas neste livro e descreve os aspectos técnicos envolvidos numa boa escolha. CONSTRAINTS O termo constraint refere-se, genericamente, às restrições impostas sobre os valores que os atributos de uma tabela podem assumir. Chaves primárias e secundárias, chaves estrangeiras e restrições de valores podem ser imaginadas como restrições que a instância de um banco de dados deve observar. Normalmente, cada constraint é identificada por um nome único, pois assim é possível, numa eventual violação das restrições lógicas do banco, identificar a regra de integridade que está sendo desrespeitada. Por exemplo, exigir que uma nota esteja entre 0 e 10 é uma restrição de valor. Outro exemplo, é determinar que o código do curso de um aluno esteja entre os códigos de curso que aparecem na tabela CURSO restrição de integridade referencial. As seções seguintes apresentam constraints que manifestam-se de várias formas por ocasião da definição de tabelas relacionais. VALORES NULOS Um atributo pode aceitar valores nulos ou não. Este aspecto está relacionado à qualidade de preenchimento em bancos de dados. No exemplo, há alguns atributos que não permitem nulos, tais como o nome de um curso: é incorreto cadastrar um curso sem que seu nome esteja preenchido. Por outro lado, a ausência de informações sobre a data de nascimento de um aluno não é impeditivo de sua inclusão, podendo-se aceitar um registro onde tal coluna ainda não esteja preenchida. create table curso codcurso char 3 not null, curso varchar 40 not null

212 Capítulo 11: Criando, eliminando e modificando tabelas create table aluno create table aluno matricula int not null, matricula int not null, nome varchar 40 not null, nome varchar 40 not null, sexo char 1, sexo char 1, codcurso char 3 not null, codcurso char 3 not null, nascimento datetime nascimento date create table professor codprofessor int not null, professor varchar 40 not null create table disciplina coddisciplina int not null, disciplina varchar 40 not null codprofessor int, chst float not null, chsp float not null create table inscricao matricula int not null, coddisciplina int not null, nota float null Note que todos os atributos declarados como not null devem ser obrigatoriamente preenchidos com valores válidos nos domínios de seus tipos. A título de exemplo, o atributo nota, que aceita nulos, foi declarado explicitamente com a palavra-chave null. Normalmente, se nada for dito em contrário, um atributo aceita nulos. CHAVES PRIMÁRIAS PRIMARY KEYS A chave primária de uma tabela é composta por um ou mais atributos que, conjuntamente, identificam univocamente um registro; não há dois registros, na instância de uma tabela, com os mesmos valores para os atributos que formam a chave primária. A chave primária é o identificador principal, e seus atributos componentes não podem conter valores nulos. Sendo um tipo de constraint, chaves primárias podem receber um nome. create table curso codcurso char 3 not null, curso varchar 40 not null, constraint pk_curso primary key codcurso create table aluno create table aluno matricula int not null, matricula int not null, nome varchar 40 not null, nome varchar 40 not null, sexo char 1, sexo char 1, codcurso char 3 not null, codcurso char 3 not null, nascimento datetime nascimento date constraint pk_aluno primary key matricula constraint pk_aluno primary key matricula create table professor codprofessor int not null, professor varchar 40 not null, constraint pk_professor primary key codprofessor create table disciplina coddisciplina int not null,

Declarando as características de uma tabela 213 disciplina varchar 40 not null, codprofessor int, chst float not null, chsp float not null, constraint pk_disciplina primary key coddisciplina create table inscricao matricula int not null, coddisciplina int not null, nota float null, constraint pk_inscricao primary key matricula, coddisciplina A chave primária da tabela INSCRIÇÃO é composta por dois atributos, matrícula e coddisciplina. Isto significa que pode haver mais de uma inscrição para uma mesma matrícula e mais de uma inscrição para a mesma disciplina, mas não pode haver mais de uma inscrição para a mesma combinação dos atributos matrícula e coddisciplina. Em algumas implementações, quando a chave primária compreende apenas um atributo, é possível especificar esta propriedade na própria declaração do atributo, conforme é apresentado nas seções específicas, mais adiante neste capítulo. Neste caso, a definição da tabela CURSO, por exemplo, poderia ter sido escrita como create table curso codcurso char 3 not null primary key, curso varchar 40 not null Note que não é obrigatório que uma tabela tenha uma chave primária. Em certos casos, é possível construir tabelas sem identificadores, ou mesmo tabelas que possuam identificadores e, ainda assim, não tenham uma chave primária definida. INTEGRIDADE REFERENCIAL CHAVES ESTRANGEIRAS O mecanismo de integridade referencial é um importante elemento dos bancos de dados relacionais, pois garante que referências intertabelas permaneçam íntegras ao longo da existência do banco dados. Essas referências são chamadas de chaves estrangeiras foreign keys e podem ser definidas sobre atributos singelos ou conjuntos de atributos. No nosso exemplo, há uma chave estrangeira definida na tabela ALUNO referenciando a tabela CURSO, além de outras três, entre as tabelas DISCIPLINA e PROFESSOR, INSCRIÇÃO E DISCIPLINA e INSCRIÇÃO e ALUNO, como mostra o esquema a seguir veja mais detalhes sobre este esquema relacional no capítulo 1. Professor CodProfessor Nome 1 0:1 Disciplina CodDisciplina Disciplina CodProfessor CHST CHSP 1 0:n Inscricao Matricula CodDisciplina Nota 0:n 1 Aluno Matricula Nome Sexo CodCurso Nascimento 0:n 1 Curso CodCurso Curso Chaves estrangeiras, sendo um tipo de constraint, podem ser nomeadas. A descrição do esquema fica sendo como abaixo. create table aluno matricula int not null, nome varchar 40 not null, sexo char 1, codcurso char 3 not null, nascimento datetime, constraint pk_aluno primary key matricula, constraint fk_aluno_curso foreign key codcurso references curso

214 Capítulo 11: Criando, eliminando e modificando tabelas create table aluno matricula int not null, nome varchar 40 not null, sexo char 1, codcurso char 3 not null, nascimento date, constraint pk_aluno primary key matricula, constraint fk_aluno_curso foreign key codcurso references curso create table disciplina coddisciplina int not null, disciplina varchar 40 not null, codprofessor int, chst float not null, chsp float not null, constraint pk_disciplina primary key coddisciplina, constraint fk_disciplina_professor foreign key codprofessor references professor create table inscricao matricula int not null, coddisciplina int not null, nota float null, constraint pk_inscricao primary key matricula, coddisciplina, constraint fk_inscricao_aluno foreign key matricula references aluno matricula, constraint fk_inscricao_disciplina foreign key coddisciplina references disciplina coddisciplina Observe, no primeiro comando, que quando a chave estrangeira referencia a chave primária de outra tabela não é preciso listar os atributos que a compõem. Nem sempre a chave primária é obrigatoriamente referenciada numa chave estrangeira. Qualquer conjunto de atributos que configurem uma chave candidata vide seção a respeito mais adiante pode ser referenciado numa chave estrangeira. Um caso interessante surge no exemplo na definição da tabela DISCIPLINA. Note que o atributo codprofessor é uma chave estrangeira em relação à tabela PROFESSOR. Contudo, esse atributo admite o valor nulo, o que significa que pode haver uma disciplina com o professor ainda indefinido, isto é, com o atributo codprofessor não preenchido. Porém, se o atributo estiver prenchido deverá necessariamente fazer referência a algum professor que exista. Algumas implementações SQL permitem que, por ocasião da definição das chaves estrangeiras, se possa definir a reação do sistema gerenciador quando operações que ocasionam violações da integridade referencial são executadas sobre as tabelas. Para ilustrar este ponto, repetimos abaixo as instâncias das tabelas DISCIPLINA e INSCRIÇÃO. INSCRIÇÃO Matricula Nota CodDisciplina 1001 NULL 112 1001 8,0 317 1002 9,5 210 1005 3,0 316 1005 4,2 117 1007 NULL 112 1007 7,0 114 1010 5,5 317 1010 10,0 316 DISCIPLINA CodDisciplina Disciplina CodProfessor CHST CHSP 112 Dir. Constitucional 3 4 0 114 Direito Civil 10 4 2 117 Estatística 15 2 2 210 Compiladores 2 2 4 211 Bancos de Dados 17 3 3 316 Sociologia 18 3 1 317 Português 12 4 0

Declarando as características de uma tabela 215 Na definição da tabela INSCRIÇÃO, fica estabelecido que o atributo coddisciplina constitui uma chave estrangeira com relação à tabela DISCIPLINA. As setas, acima, indicam as referências que de fato existem entre os registros das duas tabelas. Um dos tipos de violação da integridade referencial ocorre quando um registro referenciado é removido da base de dados. Por exemplo, suponha que o registro da disciplina Português seja removido. Há dois caminhos a seguir: um é recusar a operação; outro é remover também os registros que o referenciam, ou seja, remover todas as inscrições nesta disciplina. Este efeito é chamado remoção em cascata. O segundo tipo de violação ocorre quando há uma alteração no código de alguma disciplina referenciada. Por exemplo, se o código da disciplina Português fosse alterado para 417, as referências existentes tornar-se-iam inválidas. Novamente, há dois cursos de ação: recusar a operação, mantendo a integridade, ou promover a mesma alteração em todos os registros das inscrições, de modo a manter íntegras as referências. Este segundo efeito é chamado de propagação de atualização. Alguns SGBD oferecem uma terceira alternativa nos dois casos acima, qual seja a de preencher com nulos as referências que tornam-se inválidas. Embora isto não preserve a integridade referencial, pelo menos é possível completar a operação e, mais adiante, tratar os registros atingidos. Quanto à qualidade da referência, pode-se classificar o nível de integridade como match partial e match full. Para chaves estrangeiras compostas por mais de um atributo, match full significa que todos os atributos devem estar preenchidos, sendo a referência completa. Com match partial, presume-se ser aceitável haver alguns desses atributos componentes preenchidos com nulos. Esses aspectos são analisados em maiores detalhes nas seções que tratam dos aspectos específicos de cada implementação SQL. CHAVES CANDIDATAS Ocasionalmente, é preciso que, além da chave primária, outros atributos ou conjuntos de atributos tenham a propriedade de serem únicos numa tabela. A cláusula unique pode ser utilizada com este fim. No banco de exemplos, as tabelas DISCIPLINA e PROFESSOR têm, entre si, um relacionamento 1 para 1. Isto significa que um mesmo professor não pode estar ligado a mais de uma disciplina. Tal restrição pode ser resolvida através de uma chave candidata: basta fazer com que o atributo codprofessor, na tabela DISCIPLINA, seja um identificador. Supondo, ainda, que os atributos curso, na tabela CURSO, e disciplina, na tabela DISCIPLINA, não possam ser repetidos em diferentes registros, as declarações dessas tabelas poderiam ser construídas como create table curso codcurso int not null, curso varchar 40 not null, constraint pk_curso primary key codcurso, constraint uq_curso unique curso create table disciplina coddisciplina int not null, disciplina varchar 40 not null, codprofessor int, chst float not null, chsp float not null, constraint pk_disciplina primary key coddisciplina, constraint fk_disciplina_professor foreign key codprofessor references professor, constraint uq_disciplina unique disciplina, constraint up_codprofessor unique codprofessor Assim como a chave primária, a propriedade unique poderia aplicar-se a um conjunto de atributos. Uma mesma tabela pode ter várias chaves candidatas efeito equivalente pode ser obtido a

216 Capítulo 11: Criando, eliminando e modificando tabelas partir de índices sem duplicações, vistos no capítulo 14. Chaves candidatas são também um tipo de constraint e, portanto, podem receber nomes. VALORES DEFAULT Muitas vezes é preciso incluir registros ainda que nem todos os atributos estejam preenchidos. Quando isso ocorre, a possibilidade de se definir valores padronizados para cada coluna é importante, pois mantém o registro íntegro e evita a ocorrência de valores nulos e suas inconveniências vide capítulo 4. A palavra-chave default introduz a expressão que deve preencher o atributo no caso de ausência de valor para o mesmo na ocasião da inclusão do registro. create table disciplina coddisciplina int not null, disciplina varchar 40 not null, codprofessor int, chst float default 0 not null, chsp float default 0 not null, constraint pk_disciplina primary key coddisciplina constraint fk_disciplina_professor foreign key codprofessor references professor, constraint uq_disciplina unique disciplina, constraint up_codprofessor unique codprofessor create table disciplina coddisciplina int not null, disciplina varchar 40 not null, codprofessor int, chst float not null default 0, chsp float not null default 0, constraint pk_disciplina primary key coddisciplina constraint fk_disciplina_professor foreign key codprofessor references professor, constraint uq_disciplina unique disciplina, constraint up_codprofessor unique codprofessor As expressões que podem ser usadas para definir os valores default dos atributos dependem da implementação; em geral, são permitidas expressões aritméticas que incluem funções intrínsecas. No nosso exemplo, as cargas horárias teórica e prática, se omitidas, assumem o valor zero. No Access, a cláusula default não é aceita no SQL. Oracle e SQL Server supõem as cláusulas not null e default em ordens diferentes, o que requer duas versões para o comando acima. RESTRIÇÕES DE VALORES CLÁUSULA CHECK Os valores que um atributo pode assumir são determinados pelo domínio de seu tipo de dados correspondente. O tipo int, por exemplo, permite que o atributo armazene valores inteiros num certo intervalo. Entretanto, muitas vezes é preciso restringir ainda mais esses valores. Por e- xemplo, a nota de um aluno deve ser um valor real entre 0 e 10. Como não há um tipo de números reais neste intervalo particular, é preciso empregar um tipo numérico mais abrangente e criar uma restrição suplementar. Outro tipo comum de restrição é o controle da correlação entre diferentes atributos numa tabela. Supondo-se que a carga horária teórica das disciplinas deva ser, sempre, pelo menos igual à metade da carga horária prática, poder-se-ia refinar a declaração da tabela DISCIPLINA, com auxílio da cláusula check, como mostrado a seguir. create table disciplina coddisciplina int not null, disciplina varchar 40 not null, codprofessor int, chst float not null default 0 check chst >= 0, chsp float not null default 0 check chsp >= 0, constraint pk_disciplina primary key coddisciplina,

Declarando as características de uma tabela 217 constraint fk_disciplina_professor foreign key codprofessor references professor, constraint uq_disciplina unique disciplina, constraint up_codprofessor unique codprofessor, constraint carga_horaria check chst >= 0.5 * chsp create table disciplina coddisciplina int not null, disciplina varchar 40 not null, codprofessor int, chst float default 0 not null check chst >= 0, chsp float default 0 not null check chsp >= 0, constraint pk_disciplina primary key coddisciplina, constraint fk_disciplina_professor foreign key codprofessor references professor, constraint uq_disciplina unique disciplina, constraint up_codprofessor unique codprofessor, constraint carga_horaria check chst >= 0.5 * chsp Para a tabela ALUNO poderíamos imaginar duas restrições adicionais: que o sexo seja M ou F e que a data de nascimento esteja num intervalo plausível. 2 Uma cláusula check é formada por uma expressão lógica cujo valor final deve ser verdadeiro ou desconhecido. Note que é possível empregar os operadores in e between nas expressões que constituem uma cláusula check, assim como quaisquer outros construtores de expressões vistos no capítulo 4. create table aluno matricula int not null, nome varchar 40 not null, sexo char 1, codcurso char 3 not null, nascimento datetime, constraint pk_aluno primary key matricula, constraint fk_aluno_curso foreign key codcurso references curso, constraint aluno_sexo check sexo in 'M', 'F', constraint data_nascimento_válida check nascimento between '01/01/1950' and '31/12/2000' create table aluno matricula int not null, nome varchar 40 not null, sexo char 1, codcurso char 3 not null, nascimento datetime, constraint pk_aluno primary key matricula, constraint fk_aluno_curso foreign key codcurso references curso, constraint aluno_sexo check sexo in 'M', 'F', constraint data_nascimento_válida check nascimento between '1950-01-01' and '2000-12-31' create table aluno matricula int not null, nome varchar 40 not null, sexo char 1, codcurso char 3 not null, nascimento date, constraint pk_aluno primary key matricula, constraint fk_aluno_curso foreign key codcurso references curso, constraint aluno_sexo check sexo in 'M', 'F', constraint data_nascimento_válida check nascimento between to_date '01/01/1950', 'dd/mm/yyyy' and to_date '31/12/2000', 'dd/mm/yyyy' 2 O MySQL aceita sintaticamente a cláusula check mas não a implementa. O Access não aceita a cláusula check.

218 Capítulo 11: Criando, eliminando e modificando tabelas No último comando é preciso especificar as datas através da função to_date vista no capítulo 8. ATRIBUTOS AUTONUMERADOS Em muitos casos, a utilização de atributos cujos valores são gerados automaticamente, sem repetições, são de grande interesse em bancos de dados. No nosso banco exemplo, poderíamos imaginar que as matrículas dos alunos fossem geradas progressivamente, cada vez que um registro fosse adicionado à tabela ALUNO. Com isso, não haveria o risco de existir matrículas repetidas e nem seria preciso cuidados com o controle da numeração. Esta facilidade é provida pelas implementações SQL, porém de formas bastante distintas umas das outras. Por esse motivo, optamos por apresentar cada uma separadamente, nas seções que tratam de detalhes das implementações SQL. 11.3 ELIMINANDO TABELAS Eliminar uma tabela é extremamente fácil. O comando drop table segue a sintaxe drop table <tabela> que é auto-explicativa. Para eliminar a tabela PROFESSOR, por exemplo, bastaria o comando drop table professor Eliminar uma tabela que está sendo referenciada por alguma chave estrangeira é uma potencial violação da integridade referencial, que provoca erro na operação. Em algumas implementações, entretanto, é possível remover também as restrições de integridade ligadas à tabela sendo removida. Remover uma tabela significa: remover todos os registros da tabela; remover todos os índices criados para a tabela. 11.4 ALTERANDO AS CARACTERÍSTICAS DE UMA TABELA O comando alter table permite vários tipos de alterações numa tabela, tais como incluir, alterar e remover colunas e incluir e remover restrições de integridade. No Access não é possível alterar as propriedades de uma coluna através do SQL. Isso somente é possível através da interface de administração. ALTERANDO OS TIPOS DAS COLUNAS Para alterar o tipo de uma coluna, basta montar o comando com a opção alter column ou modify, seguida do nome da coluna sendo alterada e do novo tipo da coluna. alter table disciplina alter column disciplina varchar 50 not null alter table disciplina modify disciplina varchar 50 not null O comando acima altera o tipo do atributo disciplina para varchar50 e especifica que nulos não são aceitos neste campo.

Alterando as características de uma tabela 219 INCLUINDO NOVAS COLUNAS É possível alterar uma tabela pela introdução de novas colunas em sua estrutura, como no e- xemplo a seguir. alter table disciplina add creditos float not null default 0 alter table disciplina add creditos float default 0 not null alter table disciplina add creditos float not null Uma nova coluna, denominada créditos, é adicionada à tabela DISCIPLINA, com as características descritas. Note que, neste caso, as versões com a cláusula de valor default não são aceitas no Access. Em tabelas não vazias, novas colunas devem permitir nulos ou possuir algum valor default; caso contrário, inserir essas colunas sem uso de nulos seria uma potencial violação dos requisitos. Veja, mais adiante neste capítulo, como cada implementação procede nesta situação. REMOVENDO COLUNAS Colunas podem ser removidas através da cláusula drop column, como no exemplo a seguir. alter table disciplina drop column creditos A sintaxe é bastante simples. Eventuais constraints definidas sobre a coluna sendo eliminada devem ter sido removidas antes dessa operação. INCLUINDO CONSTRAINTS : CHAVES PRIMÁRIAS, CHAVES ESTRANGEIRAS E RESTRIÇÕES DE VALORES Qualquer um dos vários tipos de restrições de valores pode ser acrescentado a uma tabela através da cláusula add constraint. No exemplo abaixo, inclui-se a restrição de que o valor de uma hipotética coluna créditos deve ser igual ou superior à soma da carga horária teórica com a metade da carga horária prática da disciplina. alter table disciplina add constraint creditos_positivos check creditos >= chst + 0.5 * chsp As restrições são identificadas por seus respectivos nomes e não pode haver duplicação. Eventuais restrições homônimas da que está sendo inserida devem ter sido previamente removidas. Os comandos a seguir mostram exemplos com outros tipos de restrições de integridade. 3 alter table professor add constraint pk_professor primary key codprofessor ; alter table inscricao add constraint pk_inscricao primary key matricula, coddisciplina ; alter table disciplina add constraint uq_disciplina unique disciplina ; alter table disciplina add constraint fk_disciplina_professor foreign key codprofessor references professor ; No quarto comando, observe que quando uma chave estrangeira referencia a chave primária de outra tabela não é preciso listar os atributos que a compõem. Ainda que, na nossa base de e- 3 Algumas dessas restrições já foram incluídas nas tabelas por ocasião da sua definição, e são aqui repetidas apenas a título de exemplo.

220 Capítulo 11: Criando, eliminando e modificando tabelas xemplos, as chaves estrangeiras refiram-se às chaves primárias das tabelas, isso não é uma obrigatoriedade no modelo relacional. Qualquer conjunto de atributos que configure uma chave candidata vide seção a respeito mais adiante pode constituir uma chave de referência. REMOVENDO RESTRIÇÕES Restrições podem ser removidas através da cláusula drop constraint, como no exemplo a seguir. alter table disciplina drop constraint fk_disciplina_professor RESTRIÇÕES INCONSISTENTES Algumas alterações das características de uma tabela podem ou não ser bem sucedidas, dependendo da instância corrente no momento da operação. Por exemplo, se uma coluna que permite nulos é modificada para not null, é necessário que nenhum dos registros possua o valor nulo nesta coluna. Se já houver valores nulos, é necessário alterá-los todos, antes da mudança. Numa tabela não vazia, novas colunas devem permitir nulos ou possuir algum valor default; caso, contrário, a inserção dessas colunas causaria inconsistências na base de dados, pois não haveria como preenchê-las. Outros exemplos em que novas restrições podem ser inválidas ocorrem para chaves estrangeiras, índices sem duplicatas, restrições de valores e quaisquer outras exigências baseadas em condições lógicas, que devem ser verificadas na instância de uma ou mais tabelas. Veja como cada implementação trata esses casos nas seções específicas, neste capítulo. 11.5 CRIANDO, ELIMINANDO E MODIFICANDO TABELAS NO ACCESS Nem todas as alterações que o Access suporta podem ser descritas por comandos SQL. Na verdade, esses comandos são razoavelmente limitados, uma vez que supõe-se que o usuário faça uso da interface de gerenciamento. As seções a seguir detalham alguns aspectos relevantes sobre as possibilidades de alteração de tabelas no Access. SINTAXE Os comandos create table e alter table obedecem à sintaxe mostrada a seguir. <comando create table> := create table <tabela> { <definição de atributo> <constraint geral>,... <comando alter table> := alter table <tabela> <operação> <operação> := { add column <definição de atributo> add <constraint geral> drop constraint <nome de constraint> drop column <coluna> <definição de atributo> := <atributo> <tipo> [ null not null ] [ <constraint de atributo> ] <constraint geral> := constraint <nome de constraint> { { primary key unique not null <coluna>,... foreign key [ no index ] <coluna>,... references <tabela> [ <coluna>,... ]

Criando, eliminando e modificando tabelas no Access 221 [ on update cascade set null ] [ on delete cascade set null ] <constraint de atributo> := constraint <nome de constraint> { { primary key unique not null references <tabela> [ <coluna>,... ] [ on update cascade set null ] [ on delete cascade set null ] Os comandos acima compreendem a criação de tabelas e as operações de alteração, incluindo a adição e remoção de colunas e constraints. Note que mesmo as restrições que aplicam-se a apenas um atributo, não sendo explicitamente nomeadas, são tratadas genericamente como constraints. NOMES DE TABELAS, ATRIBUTOS E RESTRIÇÕES Nomes podem ser bastante flexíveis no Access. Os nomes para tabelas, atributos e restrições podem ter até 64 caracteres, incluindo letras, números, espaços e caracteres especiais, exceto. ponto,! exclamação, ` acento grave e [ ] abre/fecha colchetes. Um nome não pode iniciar com o caracter de espaço e não pode incluir caracteres de controle valores ASCII de 0 a 31. Embora sejam permitidos, caracteres especiais e espaços em nomes não são uma boa prática, pois podem causar ambigüidades no SQL. Uma tabela chamada #1 teste, por exemplo, requer o uso de colchetes num comando SQL, porque X select * from #1 teste provoca erros de sintaxe. O correto é referenciar essa tabela como select * from [#1 teste] Escrever colchetes em todas as referências a tabelas e atributos assim nomeados é um teste de paciência, que pode e deve ser evitado. O Access não difere entre maiúsculas e minúsculas nos nomes. PALAVRAS RESERVADAS O emprego de palavras reservadas no Access também é flexível. Dependendo do contexto, algumas palavras reservadas são aceitas. Por exemplo, a tabela TESTE pode ser criada como X create table teste having varchar 40 not null, between char 1 mesmo sendo os nomes dos atributos, having e between, palavras de uso reservado. Isso ocorre porque, no contexto da definição de atributos, essas duas palavras não têm papel sintático relevante. Um atributo chamado key ou unique, contudo, causaria um erro de sintaxe, pois essas últimas têm papel sintático na definição de um atributo. Note, porém, que mesmo aceitos na definição da tabela, os nomes dos atributos podem causar dores-de-cabeça mais tarde. Um comando SQL como X select having from teste where between > 12 não é aceito e deveria ser escrito select having from teste

222 Capítulo 11: Criando, eliminando e modificando tabelas where [between] > 12 Como norma geral, o mais seguro é procurar não utilizar palavras reservadas na definição de elementos do banco de dados. VALORES NULOS Access é liberal com valores nulos quando da criação de novas colunas em tabelas já instanciadas. Para tipos numéricos, mesmo que o atributo sendo criado não suporte nulos, as novas colunas assumem este valor ainda que algum valor padrão tenha sido especificado. Novos registros ou registros que sejam regravados, entretanto, são verificados quanto à presença de valores nulos. Para tipos não numéricos, uma coluna que não aceita nulos somente pode ser inserida se a tabela ainda estiver vazia. CHAVES PRIMÁRIAS PRIMARY KEYS A definição de uma chave primária implica na criação de um índice sem duplicação, que a implementa vide capítulo 14. Um índice decorrente da definição da chave primária não admite valores nulos. INTEGRIDADE REFERENCIAL CHAVES ESTRANGEIRAS No Access, é possível associar, para cada chave estrangeira, separadamente, os efeitos de remoção em cascata e/ou de propagação de atualização. Também é possível alterar para nulos os atributos atingidos quando um registro referenciado por uma chave estrangeira é removido ou alterado. VALORES DEFAULT O Access não aceita a especificação de valores default através do SQL; contudo, através da interface, qualquer expressão aritmética podendo incluir literais e funções é válida na designação do valor default de um atributo. CHAVES CANDIDATAS Toda chave candidata é implementada através de índice sem duplicação. Um índice decorrente da definição de chaves candidatas pode admitir valores nulos. Vide capítulo 14 para maiores detalhes. RESTRIÇÕES DE VALORES Restrições de valores não podem ser especificadas através da cláusula check do SQL, embora seja possível fazê-lo pela interface do Access. ATRIBUTOS AUTONUMERADOS Atributos autonumerados podem ser definidos pelo tipo autoincrement ou pelo seu sinônimo, o tipo counter. Por exemplo, se a tabela ALUNO utilizasse este recurso para a geração de números de matrícula automaticamente, a mesma poderia ter sido criada como create table aluno matricula autoincrement 1000,10 not null constraint pk_aluno primary key,

Criando, eliminando e modificando tabelas no MySQL 223 nome varchar 40 not null, sexo char 1, codcurso char 3, nascimento datetime, constraint fk_aluno_curso foreign key codcurso references curso Uma coluna autonumerada é implementada com o tipo long sinônimo de int, integer, e integer4. Depois de criada, uma coluna de autonumeração pode ter seu tipo alterado para outro qualquer, sem essa propriedade, desde que seja possível fazer a conversão dos valores. Entretanto, uma coluna normal não pode ser transformada numa coluna com autonumeração. É possível estabelecer o valor inicial e o incremento da numeração. No exemplo acima, os registros serão numerados de 10 em 10 a partir de 1000. Se nada for especificado, a numeração dos registros é gerada a partir de 1, com incremento de 1. Quando uma coluna de autonumeração é adicionada a uma tabela, todos os registros eventualmente existentes são numerados automaticamente. É possível descobrir qual foi o último valor de autoincremento utilizado em alguma tabela com a variável predefinida @@identifity, como no comando abaixo. select @@identify Note que não é possível especificar uma tabela específica. É mostrado sempre o último valor utilizado, independentemente da tabela ao qual está associado. Os valores inicial e de incremento de uma autonumeração podem ser alterados depois da criação da tabela. O comando alter table aluno alter column matricula autoincrement 50000,100 faz com que os novos valores passema a ser numerados a partir de 50000, com incrementos de 100. É preciso atenção num comando desse tipo porque os novos valores de vem ser compatíveis com os eventuais registros que já existam na tabela. 11.6 CRIANDO, ELIMINANDO E MODIFICANDO TABELAS NO MYSQL No MySQL, o tamanho máximo de cada tabela depende do tamanho permitido para os arquivos do sistema operacional. Contudo, tabelas do tipo MyISAM têm um tamanho máximo default de 4 GBytes, que pode ser estendido com a utilização das opções de tabela avg_row_length e max_rows. Cada tabela pode ter, no máximo, 32 índices podendo este limite ser aumentado para 64. SINTAXE A sintaxe dos comandos create table e alter table é apresentada a seguir. <create table> := create [ temporary ] table [ if not exists ] <tabela> { { <definição de atributo> <restrição geral>,... [<opções de tabela>... ] [ [ ignore replace ] <comando select> ] like <tabela> <alter table> := alter [ ignore ] table <tabela> <operação>,... <operação> := { add [ column ] <definição de atributo> [ first { after <coluna> ] add [ column ] <definição de atributo>,... add < restrição geral > drop [ column ] <coluna> drop primary key

224 Capítulo 11: Criando, eliminando e modificando tabelas drop index <índice> alter [ column ] <coluna> { set default <literal> drop default change [ column ] <coluna> <definição de atributo> [ first after <coluna> ] modify [ column ] <definição de atributo> [ first after <coluna> ] { enable disable keys rename [ to ] <tabela> order by { <atributo> [ asc desc ],... <opções de tabela> <definição de atributo> := <coluna> <tipo de dados> [ unsigned ] [ zerofill ] [ <restrição de atributo>,... ] <restrição geral> := { [ primary ] key <atributo>,... index [ <índice> ] <atributo>,... unique [ <índice> ] <atributo>,... fulltext [ <índice> ] <atributo>,... check <expressão> [ [ constraint ] <restrição> ] foreign key <índice> <atributo>,... <referência estrangeira> <restrição de atributo> := { [ not ] null default <valor> auto_increment [ primary ] key <referência estrangeira> <referência estrangeira> := references <tabela> [ <atributo>,... ] [ match full match partial ] [ on delete { restrict cascade set null no action set default ] [ on update { restrict cascade set null no action set default ] <opções de tabela> := { type = { bdb heap isam innodb merge mrg_myisam myisam auto_increment = <número> avg_row_lenght = <número> checksum = { 0 1 comment = " <string> " max_rows = <número> min_rows = <número> packkeys = { 0 1 default password = " <string> " delay_key_write = { 0 1 row_format = { default dynamic fixed compressed raid_type = { 1 striped raid0 raid_chunks = <número> raid_chunksize = <número> union = <tabela>,... insert_method = { no first last data directory = " <path> " index directory = " <path> " O significado das construções desta sintaxe e seus aspectos mais relevantes são discutidos a seguir. MOSTRANDO AS TABELAS Inicialmente, é importante saber como obter a definição corrente de cada tabela num banco de dados MySQL. Com isso, é possível conferir o efeito dos comandos aqui mostrados e exemplificados. O comando show tables mostra as tabelas existentes num banco de dados. O resultado é uma lista de nomes que inclui todas as tabelas permanentes do banco de dados.

Criando, eliminando e modificando tabelas no MySQL 225 O comando describe ou desc exibe as principais informações sobre a estrutura de uma tabela. { describe desc <tabela> { <coluna> <string de comparação> Em tabelas com muitas colunas, pode-se especificar alguma coluna em particular ou fornecer uma string genérica, que pode conter os caracteres curinga % percentual, significando qualquer string, e _ sublinhado, significando qualquer caracter. Por exemplo, o comando describe aluno produz a listagem do quadro a seguir. Um comando como Field Type Collation Null Key Default Extra matricula int11 binary PRI 0 nome varchar40 latin1_swedish_ci sexo char1 latin1_swedish_ci YES NULL codcurso char3 latin1_swedish_ci YES NULL nascimento date latin1_swedish_ci YES NULL 5 rows in set 0.00 sec desc disciplina chst produz resultado semelhante, porém mostrando somente a coluna chst. Já o comando describe disciplina 'ch%' produz informações sobre as colunas chst e chsp. O comando show create table é útil para exibir as características de uma tabela. Usando, por exemplo, show create table aluno é possível conhecer todas as características correntes da referida tabela, na forma de um comando create table remontado. TIPOS DE TABELAS MySQL trabalha com tabelas de vários tipos, que dividem-se em dois grupos: tabelas com suporte a transações e tabelas sem suporte a transações. Tabelas sem suporte a transações Tabelas com suporte a transações MyISAM MERGE HEAP ISAM InnoDB BDB Todas as tabelas têm um arquivo.frm que contém suas definições. Tabelas que não suportam transações requerem menos espaço e operam mais rapidamente, pois não há necessidade das tarefas extras do sistema por conta desse gerenciamento. Tabelas com suporte à transação permitem, por exemplo, operações de rollback, pois mantêm atas logs de todas as suas operações. Tabelas MyISAM É o tipo default no MySQL. Têm seus dados gravados em arquivos.myd e índices gravados em arquivos.myi. Utilizam índices do tipo B-tree 4 e podem existir sob três formatos: static registros de tamanho fixo, dynamic registros de tamanho variável e compressed formato para 4 Veja detalhes sobre índices no capítulo 14.

226 Capítulo 11: Criando, eliminando e modificando tabelas leitura apenas. Tabelas deste tipo são armazenadas em arquivos no diretório do banco de dados. Para uma tabela denominada TESTE, por exemplo, criam-se os arquivos 5 test e.frm test e.myd teste.myi definições para a tabela dados armazenados estruturas de índices Tabelas MERGE ou MRG_MyISAM Tabelas desse tipo são formadas a partir da união de outras tabelas MyISAM. Com isso, pode-se operar sobre as tabelas componentes simultaneamente, com comandos como select, update ou delete. Também são úteis para a consolidação de dados, uma vez que tabelas de diferentes fontes podem ser unificadas facilmente. Contudo, há várias limitações em relação aos comandos permitidos sobre elas, além de restrições de uso das tabelas componentes de uma tabela MERGE quando esta está em uso. O termo MRG_MyISAM pode ser empregado como sinônimo de MERGE. Tabelas HEAP São tabelas armazenadas exclusivamente na memória, que utilizam índices do tipo hash sendo, portanto, extremamente rápidas. Não há garantia alguma contra falhas do sistema. Tabelas desse tipo são usualmente empregadas como tabelas temporárias, de fácil reconstrução em caso de pane. Há várias restrições sobre as operações que podem suportar, além de cuidados a tomar por ocasião da sua criação. Tabelas ISAM Este tipo de tabela foi sobrepujado pelo tipo MyISAM e tende a desaparecer, embora ainda possa ser utilizado em algumas versões. Tabelas InnoDB InnoDB, na verdade, constitui uma máquina de banco de dados que suporta transações, recuperação de informação, locks e multi-uso, e outras características. Diferentemente das tabelas MyISAM, que armazenam seus dados e índices em arquivos específicos, tabelas InnoDB armazenam dados e índices em tablespaces, que podem abranger vários arquivos. Algumas instalações devem ser explicitamente configuradas para abrigar esse tipo de tabela. Tabelas BDB São tabelas criadas na máquina BerkeleyDB e suportam controle de transações, commit e rollback. Essas tabelas são suportadas primordialmente em instalações Unix. Algumas instalações devem ser explicitamente configuradas para abrigar tabelas desse tipo. O tipo de uma tabela é estabelecido no comando create table, como no exemplo a seguir. create table teste a varchar 40 not null, b int type = myisam Uma tabela já existente pode ser convertida para um outro tipo. O comando alter table teste type = innodb altera o tipo da tabela criada acima. Se for escolhido um determinado tipo de tabela que não esteja disponível na instalação, MySQL cria a tabela usando um tipo assemelhado em geral, MyISAM. Por exemplo, a indisponibilidade do tipo BDB acarreta a utilização do tipo MyISAM como alternativa. 5 Os nomes dos arquivos preservam maiúsculas e minúsculas empregadas no nome da tabela.

Criando, eliminando e modificando tabelas no MySQL 227 Muitas vezes, é comum que durante o teste de uma base de dados seja preciso repetir os comandos de criação de tabelas até que o projeto esteja estabilizado. Nessas situações, é interessante utilizar a opção if not exists, disponível no MySQL, que evita erros na criação de uma tabela quando a mesma já existe. Por exemplo, o comando create table if not exists teste a varchar 40 not null, b int somente leva adiante a criação da tabela se ainda não existir tabela como o mesmo nome. Note que a tabela existente não precisa ser idêntica à que está sendo criada; basta que tenham nomes iguais. NOMES Os nomes para bancos de dados e tabelas podem ter até 64 caracteres. Em função do método de armazenagem de dados do MySQL, nomes de bancos seguem as mesmas regras para pastas do sistema operacional, exceto os caracteres. ponto, / barra e \ barra invertida. Os nomes de tabelas seguem as mesmas regras dos nomes de arquivos, exceto pelos caracteres. ponto e / barra. Nomes de colunas podem ter até 64 caracteres e aceitam qualquer caracter; nomes alternativos, usados em cláusulas as, podem ter até 255 caracteres e também aceitam qualquer caracter. Em todos os casos, contudo, excetuam-se os caracteres ASCII de códigos 0 e 255, além dos caracteres que denotam aspas simples ou duplas. Note que isso implica em cuidados quando utilizam-se sistemas operacionais distintos, uma vez que as regras de denominação de pastas e arquivos podem diferir de ambiente para ambiente. Outra conseqüência disso é que nomes de bancos de dados e tabelas passam a ser diferenciados em maiúsculas e minúsculas, uma vez que alguns sistemas operacionais, como Unix, assim o fazem. Nomes alternativos de tabelas, introduzidos pelas cláusulas as, diferenciam maiúsculas e minúsculas e requerem cuidado. Um comando como X select A.nome from aluno a provoca erro, pois a variável de registro A não é reconhecida. Uma forma de evitar equívocos com caixas altas e baixas é utilizar a opção lower_case_table_names ligada, pois a mesma força os nomes de bancos e tabelas para caixa baixa. Espaços e caracteres especiais em nomes continuam não sendo uma boa idéia, pois podem causar ambigüidades. Uma tabela chamada teste duplo, por exemplo, requer o uso do delimitador ` acento grave num comando SQL, porque select * from teste duplo provoca erros de sintaxe. O correto é referenciar essa tabela como abaixo. select * from `teste duplo` É sempre bom lembrar: jamais use nomes contendo espaços ou caracteres especiais, exceto o caracter _ sublinhado. PALAVRAS RESERVADAS O comando create table teste having varchar 40 not null, between char 1

228 Capítulo 11: Criando, eliminando e modificando tabelas não é aceito porque o MySQL proíbe expressamente o uso de palavras reservadas na designação de nomes, qualquer que seja o contexto. Entretanto, um comando com os mesmos nomes com o delimitador ` acento grave create table teste `having` varchar 40 not null, `between` char 1 é aceito. Mas tudo tem seu preço. Invocar esses atributos requer delimitadores, que podem ser ` acento grave, ' apóstrofo ou " aspas duplas. O nome da tabela aceita somente o delimitador ` acento grave. Assim, os comandos funcionam, mas o comando select having from teste select 'having' from teste select `having` from teste não funciona. X select having from teste TIPOS MODIFICADOS Em alguns casos, o MySQL promove pequenas alterações nos tipos escolhidos para os atributos, tanto na criação de uma tabela como na sua alteração. Isso acontece principalmente em atributos que armazenam strings. Veja mais detalhes no capítulo 7, na seção que trata dos tipos no MySQL. TIPOS NUMÉRICOS COM UNSIGNED E ZEROFILL Um tipo numérico pode ser modificado com a opção unsigned, como foi explicado no capítulo 7. Normalmente, um tipo numérico aceita valores positivos e negativos. A opção unsigned determina que valores negativos não sejam aceitos. Quando um atributo de tipo numérico é definido com a propriedade zerofill, os valores dessa coluna são preenchidos com zeros à esquerda, até o tamanho do campo, toda vez que são mostrados no resultado de uma consulta. Por exemplo, se a tabela DISCIPLINA tivesse sido definida como no comando abaixo create table disciplina coddisciplina int not null, disciplina varchar 40 not null, codprofessor int, chst float not null default 0 check chst >= 0, chsp float zerofill not null default 0 check chsp >= 0, constraint pk_disciplina primary key coddisciplina, constraint fk_disciplina_professor foreign key codprofessor references professor, constraint uq_disciplina unique disciplina, constraint up_codprofessor unique codprofessor, constraint carga_horaria check chst >= 0.5 * chsp o resultado de um comando select para todos os registros da tabela seria mostrado como coddisciplina disciplina codprofessor chst chsp 112 Dir. Constitucional 15 4 00000000000 114 Direito Civil 2 4 00000000002 117 Estatística 12 2 00000000002 210 Compiladores 17 2 00000000004