Capítulo 2. Definição de Dados

Índice
2.1. Fundamentos de tabela
2.2. Colunas do sistema
2.3. Valor padrão
2.4. Restrições
2.4.1. Restrição de verificação
2.4.2. Restrição de não-nulo
2.4.3. Restrição de unicidade
2.4.4. Chave primária
2.4.5. Chave estrangeira
2.5. Herança
2.6. Modificação de tabelas
2.6.1. Incluir coluna
2.6.2. Excluir coluna
2.6.3. Incluir restrição
2.6.4. Excluir restrição
2.6.5. Mudar valor padrão
2.6.6. Mudar nome de coluna
2.6.7. Mudar nome de tabela
2.7. Privilégios
2.8. Esquemas
2.8.1. Criação de esquema
2.8.2. O esquema público
2.8.3. O caminho de procura do esquema
2.8.4. Esquemas e privilégios
2.8.5. O esquema do catálogo do sistema
2.8.6. Formas de utilização
2.8.7. Portabilidade
2.9. Outros objetos de banco de dados
2.10. Seguindo as dependências

Este capítulo mostra a criação das estruturas no banco de dados que armazenam os dados. Em bancos de dados relacionais os dados são armazenados em tabelas, portanto a maior parte deste capítulo é dedicada a explicar como as tabelas são criadas e modificadas, e as funcionalidades disponíveis para controlar os dados que podem ser armazenados nas tabelas. Em seguida é discutido como as tabelas podem ser organizadas em esquemas, e quais privilégios podem ser atribuídos às tabelas. Ao final são vistas superficialmente outras funcionalidades que afetam o armazenamento dos dados, como visões, funções e gatilhos. Informações detalhadas relativas a estes tópicos podem ser encontradas no Guia do Programador do PostgreSQL.

2.1. Fundamentos de tabela

Uma tabela em um banco de dados relacional é muito semelhante a uma tabela no papel: é composta 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 SQL não dá nenhuma garantia relativa à ordem das linhas na tabela. Quando uma tabela é lida, as linhas aparecem em uma ordem aleatória, a não ser que uma ordenação seja explicitamente requisitada. Esta parte é descrita no Capítulo 4. 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 no qual a linguagem SQL está baseada, 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. Isto confere uma semântica [1] aos dados armazenados na coluna, permitindo que estes dados possam ser operados por computador. Por exemplo, uma coluna declarada como sendo de um tipo numérico não pode armazenar 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 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 um nome e uma semântica óbvia, portanto uma explicação detalhada será postergada até o Capítulo 5. Alguns dos tipos de dado freqüentemente 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 a data quanto a hora.

Para criar uma tabela é utilizado o comando CREATE TABLE, próprio para esta tarefa. Neste comando são especificados ao menos o nome da nova tabela, os nomes das colunas, e os tipos 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 nomes de identificadores explicada na Seção 1.1.1. Normalmente os nomes dos tipos também são identificadores, mas existem algumas exceções. Observe que a lista de colunas é separada por vírgula, e que esta lista está entre parênteses.

Obviamente, o exemplo anterior é muito artificial. Normalmente os nomes das tabelas e das colunas estão associados às informações armazenadas. Sendo assim, vejamos um exemplo mais realista:

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

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

Dica: Quando são criadas tabelas inter-relacionadas, aconselha-se escolher uma forma consistente para atribuir nomes às tabelas e colunas. Para exemplificar, existe a possibilidade de utilizar nomes de tabelas no singular ou no plural, e cada uma destas formas é defendida por uma teoria ou por outra.

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 é mais necessária, pode ser removida pelo comando DROP TABLE. Por exemplo:

DROP TABLE minha_primeira_tabela;
DROP TABLE produtos;

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

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

Utilizando as ferramentas discutidas 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 conveniência. Se você está ansioso para colocar dados nas tabelas neste instante, então pode ir direto para o Capítulo 3 e ler o restante deste capítulo depois.

Notas

[1]

Semântica: o significado das palavras, por oposição à sua forma - Dicionário Eletrônico Houaiss. (N.T.)