Capítulo 5. Definição de dados

Sumário
5.1. Noções básicas de tabela
5.2. Colunas do sistema
5.3. Valor padrão
5.4. Restrições
5.4.1. Restrições de verificação
5.4.2. Restrições de não-nulo
5.4.3. Restrições de unicidade
5.4.4. Chaves primárias
5.4.5. Chaves estrangeiras
5.4.6. Exemplos do tradutor
5.5. Herança
5.6. Modificação de tabelas
5.6.1. Adicionar coluna
5.6.2. Remover coluna
5.6.3. Adicionar restrição
5.6.4. Remover restrição
5.6.5. Mudar valor padrão da coluna
5.6.6. Mudar nome de coluna
5.6.7. Mudar nome de tabela
5.7. Privilégios
5.8. Esquemas
5.8.1. Criação de esquema
5.8.2. O esquema público
5.8.3. O caminho de procura do esquema
5.8.4. Esquemas e privilégios
5.8.5. O esquema do catálogo do sistema
5.8.6. Modelos de utilização
5.8.7. Portabilidade
5.8.8. Exemplos
5.9. Outros objetos de banco de dados
5.10. Seguindo as dependências

Este capítulo mostra como criar as estruturas de banco de dados que armazenam os dados. Nos bancos de dados relacionais os dados são armazenados em tabelas, por isso a maior parte deste capítulo dedica-se a explicar como as tabelas são criadas e modificadas, e as funcionalidades disponíveis para controlar que dados podem ser armazenados nas tabelas. Em seguida é mostrado como as tabelas podem ser organizadas em esquemas, e como atribuir privilégios às tabelas. No final são vistas, superficialmente, outras funcionalidades que afetam o armazenamento dos dados, como visões, funções e gatilhos.

5.1. Noções básicas de tabela

Uma tabela em um banco de dados relacional é muito semelhante a uma tabela no papel: é formada por linhas e colunas. O número e a ordem das colunas são fixos, e cada coluna possui um nome. O número de linhas é variável, refletindo a quantidade de dados armazenados em um determinado instante. O padrão SQL não dá nenhuma garantia sobre a ordem das linhas na tabela. Quando a tabela é lida, as linhas aparecem em uma ordem aleatória, a não ser que a classificação seja requisitada explicitamente. Esta parte é descrita no Capítulo 7 . Além disso, o SQL não atribui identificadores únicos para as linhas e, portanto, é possível existirem várias linhas totalmente idênticas na tabela. Isto é uma conseqüência do modelo matemático subjacente ao SQL, mas geralmente não é desejável. Mais adiante neste capítulo será mostrado como lidar com esta questão.

Cada coluna possui um tipo de dado. O tipo de dado restringe o conjunto de valores que podem ser atribuídos à coluna e atribui semântica [1] aos dados armazenados na coluna, de forma que estes possam ser processados. Por exemplo, uma coluna declarada como sendo de um tipo numérico não aceita cadeias de caracteres com texto arbitrário, e os dados armazenados nesta coluna podem ser utilizados para efetuar cálculos matemáticos. Ao contrário, uma coluna declarada como sendo do tipo cadeia de caracteres aceita praticamente qualquer espécie de dado, mas não pode ser usada para efetuar cálculos matemáticos, embora possam ser efetuadas outras operações, como a concatenação de cadeias de caracteres.

O PostgreSQL possui um extenso conjunto de tipos de dado nativos, adequados para muitas aplicações. Os usuários também podem definir seus próprios tipos de dado. A maioria dos tipos de dado nativos possui nome e semântica óbvia, portanto uma explicação detalhada será postergada até o Capítulo 8 . Alguns dos tipos de dado mais utilizados são o integer para números inteiros, numeric para números possivelmente fracionários, text para cadeias de caracteres, date para datas, time para valores da hora do dia, e timestamp para valores contendo tanto data quanto hora.

Para criar uma tabela utiliza-se o comando CREATE TABLE. Neste comando são especificados, ao menos, o nome da nova tabela, os nomes das colunas, e o tipo de dado de cada coluna. Por exemplo:

CREATE TABLE minha_primeira_tabela (
    primeira_coluna text,
    segunda_coluna integer
);

Este comando cria a tabela chamada minha_primeira_tabela contendo duas colunas. A primeira coluna chama-se primeira_coluna, e possui o tipo de dado text; a segunda coluna chama-se segunda_coluna, e possui o tipo de dado integer. O nome da tabela e das colunas obedecem a sintaxe para identificadores explicada na Seção 4.1.1 . Normalmente os nomes dos tipos também são identificadores, mas existem algumas exceções. Deve ser observado que a lista de colunas é envolta por parênteses, e os elementos da lista são separados por vírgula.

Obviamente, o exemplo anterior é muito artificial. Normalmente são dados nomes para as tabelas e para as colunas condizentes com as informações armazenadas. Sendo assim, vejamos um exemplo mais próximo da realidade:

CREATE TABLE produtos (
    cod_prod   integer,
    nome       text,
    preco      numeric
);

(O tipo numeric pode armazenar a parte fracionária, comum em valores monetários)

Dica: Quando são criadas tabelas inter-relacionadas, é aconselhável escolher um padrão coerente para atribuir nomes às tabelas e colunas. Por exemplo, existe a possibilidade de utilizar nomes de tabelas no singular ou no plural, e cada uma destas possibilidades é defendida por um teórico ou por outro.

Existe um limite de quantas colunas uma tabela pode conter. Dependendo dos tipos das colunas, pode ser entre 250 e 1600. Entretanto, definir uma tabela com esta quantidade de colunas é muito raro e, geralmente, torna o projeto questionável.

Se uma tabela não for mais necessária, pode-se removê-la utilizando o comando DROP TABLE. Por exemplo:

DROP TABLE minha_primeira_tabela;
DROP TABLE produtos;

Tentar remover uma tabela não existente é um erro. Entretanto, é comum os arquivos de script SQL tentarem remover a tabela incondicionalmente antes de criá-la, ignorando a mensagem de erro.

Se for necessário modificar uma tabela existente consulte a Seção 5.6 mais adiante neste capítulo.

Utilizando as ferramentas mostradas até este ponto é possível criar tabelas totalmente funcionais. O restante deste capítulo está relacionado com a adição de funcionalidades na definição da tabela para garantir a integridade dos dados, a segurança, ou a comodidade. Se você está ansioso para colocar dados nas tabelas neste instante, então pode ir direto para o Capítulo 6 e ler o restante deste capítulo depois.

Notas

[1]

semântica — do Gr. semantiké, da significação — estudo da linguagem humana do ponto de vista do significado das palavras e dos enunciados. PRIBERAM - Língua Portuguesa On-Line . (N. do T.)

SourceForge.net Logo