5.1. Fundamentos 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 — reflete a quantidade de dados armazenados em um dado momento. 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, portanto é possível existirem várias linhas totalmente idênticas na tabela. Isso é uma consequência do modelo matemático subjacente ao SQL, mas geralmente não é desejável. Mais adiante nesse capítulo será mostrado como lidar com essa questão.

Cada coluna possui um tipo de dados. O tipo de dados limita o conjunto de valores que podem ser atribuídos à coluna e atribui semântica aos dados armazenados na coluna, de forma que esses possam ser usados no processamento. Por exemplo, uma coluna declarada como sendo de tipo de dados numérico não aceita cadeias de caracteres com texto arbitrário, e os dados armazenados nessa coluna podem ser usados para efetuar cálculos matemáticos. Ao contrário, uma coluna declarada como sendo do tipo de dados cadeia de caracteres aceita praticamente qualquer tipo de dados, 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 inclui um conjunto considerável de tipos de dados integrados que se adaptam a muitas aplicações. Os usuários também podem definir seus próprios tipos de dados. A maioria dos tipos de dados internos tem nomes e semântica óbvios, então adiamos uma explicação detalhada para o Capítulo 8. Alguns tipos de dados usados com frequência são integer para números inteiros, numeric para números possivelmente fracionários, text para cadeias de caracteres, date para datas, time para valores de hora do dia e timestamp para valores contendo data e hora.

Para criar uma tabela, é usado o comando CREATE TABLE. Nesse comando é necessário especificar, pelo menos, o nome da nova tabela, os nomes das colunas, e o tipo de dados de cada coluna. Por exemplo:

CREATE TABLE minha_primeira_tabela (
    primeira_coluna text,
    segunda_coluna integer
);

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

O exemplo acima é obviamente extremamente simplista. 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 (
    num_produto integer,
    nome text,
    preco numeric
);

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

Dica

Quando são criadas muitas tabelas inter-relacionadas, se recomenda escolher um padrão de nomes consistente para as tabelas e colunas. Por exemplo, existe a possibilidade de utilizar nomes de tabelas no singular ou no plural, e cada uma dessas possibilidades é defendida por um teórico ou por outro.

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

Se uma tabela não for mais necessária, poderá ser removida usando o comando DROP TABLE. Por exemplo:

DROP TABLE minha_primeira_tabela;
DROP TABLE produtos;

Tentar remover uma tabela que não existe causa erro. Entretanto, é comum os arquivos de script SQL tentarem remover a tabela incondicionalmente antes de criá-la, ignorando a mensagem de erro, para que o script funcione independentemente da tabela existir ou não. (Se desejar, pode ser usada a forma alternativa DROP TABLE IF EXISTS para evitar as mensagens de erro, mas isso não é SQL padrão.)

Se for necessário modificar uma tabela existente, veja a Seção 5.7 mais adiante nesse capítulo.

Utilizando as ferramentas mostradas até aqui é possível criar tabelas totalmente funcionais. O restante desse 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 estiver ansioso para colocar dados nas tabelas nesse instante, então você poderá ir diretamente para o Capítulo 6 e ler o restante deste capítulo depois.