Tutorial PostgreSQL
Tutorial PostgreSQL
Legal Notice
PostgreSQL is Copyright © 1996-2002 by the PostgreSQL Global Development Group and is distributed under the terms of the license of the
University of California below.
Postgres95 is Copyright © 1994-5 by the Regents of the University of California.
Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written
agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all
copies.
IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE
AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PRO-
VIDED HEREUNDER IS ON AN “AS-IS” BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
Índice
Prefácio ....................................................................................................................................................................i
1. O que é o PostgreSQL? ...............................................................................................................................i
2. Uma breve história do PostgreSQL.............................................................................................................i
2.1. O projeto POSTGRES de Berkeley ...............................................................................................ii
2.2. O Postgres95..................................................................................................................................ii
2.3. O PostgreSQL...............................................................................................................................iii
3. O que está contido neste manual ...............................................................................................................iii
4. Revisão dos recursos de documentação .................................................................................................... iv
5. Terminologia e notação .............................................................................................................................. v
6. Guia para relatar erros ...............................................................................................................................vi
6.1. Identificando erros ........................................................................................................................vi
6.2. O que relatar .................................................................................................................................vi
6.3. Aonde relatar os erros.................................................................................................................viii
1. Iniciando ............................................................................................................................................................. 1
1.1. Instalação................................................................................................................................................. 1
1.2. Fundamentos da Arquitetura ................................................................................................................... 1
1.3. Criando um banco de dados .................................................................................................................... 2
1.4. Acessando um banco de dados................................................................................................................ 3
2. A linguagem SQL............................................................................................................................................... 5
2.1. Introdução................................................................................................................................................ 5
2.2. Conceitos................................................................................................................................................. 5
2.3. Criando uma nova tabela ......................................................................................................................... 5
2.4. Povoando uma tabela com linhas ............................................................................................................ 6
2.5. Consultando uma tabela .......................................................................................................................... 7
2.6. Junções entre tabelas ............................................................................................................................... 8
2.7. Funções de agregação............................................................................................................................ 10
2.8. Atualizações .......................................................................................................................................... 12
2.9. Exclusões............................................................................................................................................... 12
3. Funcionalidades avançadas............................................................................................................................. 14
3.1. Introdução.............................................................................................................................................. 14
3.2. Visões .................................................................................................................................................... 14
3.3. Chaves estrangeiras ............................................................................................................................... 14
3.4. Transações ............................................................................................................................................. 15
3.5. Herança.................................................................................................................................................. 16
3.6. Conclusão .............................................................................................................................................. 18
Bibliografia ........................................................................................................................................................... 19
Index...................................................................................................................................................................... 21
iii
Prefácio
1. O que é o PostgreSQL?
O PostgreSQL é um sistema de gerenciamento de banco de dados objeto-relacional (SGBDOR) baseado no
POSTGRES, Versão 4.21, desenvolvido no Departamento de Ciência da Computação da Universidade da Cal-
ifórnia em Berkeley. O projeto POSTGRES, liderado pelo Professor Michael Stonebraker, foi patrocinado pelas
seguintes instituições: Defense Advanced Research Projects Agency (DARPA); Army Research Office (ARO);
National Science Foundation (NSF); e ESL, Inc.
O PostgreSQL descende deste código original de Berkeley, possuindo o código fonte aberto. Fornece suporte às
linguagens SQL92/SQL99 além de outras funcionalidades modernas.
O POSTGRES foi o pioneiro em muitos conceitos objeto-relationais que agora estão se tornando disponíveis em
alguns bancos de dados comerciais. Os Sistemas de Gerenciamento de Bancos de Dados Relacionais (SGBDR)
tradicionais suportam um modelo de dados que consiste em uma coleção de relações com nome, contendo atribu-
tos de um tipo específico. Nos sistemas comerciais em uso, os tipos possíveis incluem número de ponto flutuante,
inteiro, cadeia de caracteres, monetário e data. É largamente reconhecido que este modelo não é adequado para
aplicações futuras de processamento de dados. O modelo relacional substituiu com sucesso os modelos anteri-
ores em parte devido à sua “simplicidade Espartana”. Entretanto, esta simplicidade tornou a implementação de
certas aplicações muito difícil. O PostgreSQL oferece um substancial poder adicional, devido à incorporação dos
conceitos mostrados abaixo de uma forma que os usuários podem facilmente estender o sistema:
• herança
• tipos de dados
• funções
• restrições
• gatilhos
• regras
• integridade da transação
Estas funcionalidades colocam o PostgreSQL dentro da categoria de bancos de dados referida como objeto-
relacional. Repare que isto é diferente daqueles referidos como orientados a objetos que, em geral, não são
muito adequados para dar suporte às linguagens de banco de dados relacionais tradicionais. Portanto, embora o
PostgreSQL possua algumas funcionalidades de orientação a objetos, está firmemente ligado ao mundo dos bancos
de dados relacionais. Na verdade, alguns bancos de dados comerciais incorporaram recentemente funcionalidades
nas quais o PostgreSQL foi o pioneiro.
1. http://s2k-ftp.CS.Berkeley.EDU:8000/postgres/postgres.html
i
Prefácio
banco de dados de código aberto disponível em qualquer lugar, oferecendo controle de concorrência multi-versão,
suportando praticamente todas as construções do SQL (incluindo subconsultas, transações, tipos definidos pelo
usuário e funções), e dispondo de um amplo conjunto de ligações com linguagens procedurais (incluindo C, C++,
Java, Perl, Tcl e Python).
2.2. O Postgres95
Em 1994, Andrew Yu e Jolly Chen adicionaram um interpretador da linguagem SQL ao POSTGRES. O Post-
gres95 foi em seguida liberado para a Web para encontrar seu caminho no mundo como um descendente de
código aberto do código original do POSTGRES de Berkeley.
O código do Postgres95 era totalmente escrito em ANSI C e reduzido em tamanho em 25%. Muitas mudanças
internas melhoraram o desempenho e a facilidade de manutenção. O Postgres95 release 1.0.x era 30-50% mais
rápido em comparação com o POSTGRES versão 4.2, utilizando o Wisconsin Benchmark. Além da correção de
erros, as melhorias principais foram as seguintes:
• A linguagem de consultas PostQUEL foi substituída pelo SQL (implementado no servidor). As subconsultas
não foram suportadas até o PostgreSQL (veja abaixo), mas podiam ser imitadas no Postgres95 através de
funções SQL definidas pelo usuário. As agregações foram re-implementadas. O suporte para a cláusula GROUP
2. http://www.informix.com/
3. http://www.ibm.com/
4. http://meteora.ucsd.edu/s2k/s2k_home.html
ii
Prefácio
BY das consultas também foi adicionado. A interface da libpq permaneceu disponível para os programas
escritos na linguagem C.
• Adicionalmente ao programa monitor, um novo programa (psql) foi fornecido para consultas SQL interativas
utilizando o Readline do GNU.
• Uma nova biblioteca cliente, libpgtcl, suportava clientes baseados no Tcl. Uma shell, pgtclsh, permitia
que os novos comandos Tcl fizessem uma interface entre os programas Tcl e o servidor Postgres95.
• A interface para objetos grandes foi refeita. A Inversão de objetos grandes era o único mecanismo para
armazená-los (O sistema de arquivos Inversão foi removido).
• O sistema de regras no nível de instância foi removido. As regras ainda estavam disponíveis através de regras
de reescrita.
• Um breve tutorial introduzindo as funcionalidades regulares da linguagem SQL, assim como as do Postgres95,
foi distribuído junto com o código fonte.
• O utilitário make do GNU (no lugar do make do BSD) foi utilizado para a geração. Além disso, o Postgres95
podia ser compilado com o GCC sem correções (alinhamento de dados para a precisão dupla foi corrigido).
2.3. O PostgreSQL
Em 1996 se tornou claro que o nome “Postgres95” não resistiria ao teste do tempo. Foi escolhido então um novo
nome, PostgreSQL, para refletir o relacionamento entre o POSTGRES original e as versões mais recentes com
funcionalidade SQL. Ao mesmo tempo, foi mudado o número da versão para começar em 6.0, colocando os
números de volta na seqüência original começada pelo projeto POSTGRES de Berkeley.
A ênfase durante o desenvolvimento do Postgres95 era identificar e compreender os problemas existentes no
código do servidor. Com o PostgreSQL, a ênfase foi mudada para a melhoria das funcionalidades e dos recursos,
embora o trabalho continuasse em todas as áreas.
As principais melhorias no PostgreSQL incluem:
• O bloqueio no nível de tabela foi substituído por um sistema de concorrência multi-versão, que permite aos
que estão lendo continuarem a ler dados consistentes durante a atividade de escrita, e permite efetuar cópias de
segurança através do pg_dump enquanto o banco de dados se mantém disponível para consultas.
• A implementação de funcionalidades importantes no servidor, incluindo subconsultas, padrões, restrições e
gatilhos.
• A incorporação de funcionalidades adicionais compatíveis com a linguagem SQL92, incluindo chaves
primárias, identificadores entre aspas, conversão implícita de tipo de cadeias de caracteres literais, conversão
explícita de tipos e inteiros binários e hexadecimais.
• Os tipos nativos foram aperfeiçoados, incluindo uma grande variedade de tipos para data e hora e suporte
adicional para tipo geométrico.
• A velocidade geral do código do servidor foi melhorada em aproximadamente 20-40%, e o tempo de inicial-
ização do servidor foi reduzido em 80% desde que a versão 6.0 foi liberada.
iii
Prefácio
Tutorial do PostgreSQL
Uma introdução informal para os novos usuários.
Guia do Usuário do PostgreSQL
Documenta o ambiente da linguagem de consulta SQL, incluindo tipos de dados e funções, assim como o
ajuste do desempenho no nível de usuário. Todo usuário do PostgreSQL deve lê-lo.
Guia do Administrador do PostgreSQL
Informações sobre a instalação e a administração do servidor. Todos os que administram um servidor Post-
greSQL, tanto para uso pessoal quanto para uso por outras pessoas, devem lê-lo.
Guia do Programador do PostgreSQL
Informações avançadas para programadores de aplicativos. Os tópicos incluem a extensibilidade de tipo e de
função, interfaces com bibliotecas e questões relativas ao projeto de aplicativos.
Manual de Referência do PostgreSQL
Páginas de referência contendo a sintaxe para os comandos SQL, programas para a estação cliente e servidor.
Este manual é um auxílio aos Guias do Usuário, do Administrador e do Programador.
Guia do Desenvolvedor do PostgreSQL
Informações para os desenvolvedores do PostgreSQL. Feito para àqueles que estão contribuindo para o
projeto PostgreSQL. As informações sobre o desenvolvimento de aplicativos estão mostradas no Guia do
Programador.
Além deste conjunto de manuais, existem outros recursos para ajudar na instalação e uso do PostgreSQL:
man pages
As páginas do Manual de Referência no formato tradicional “man” do Unix. Não existe diferença no con-
teúdo.
iv
Prefácio
FAQs
As listas de perguntas freqüentemente formuladas (Frequently Asked Questions - FAQ) documentam tanto
questões gerais como algumas questões específicas para uma plataforma.
READMEs
Os arquivos README (leia-me) estão disponíveis em alguns pacotes contribuídos.
Sítio na Web
O sítio na Web do PostgreSQL 5 possui detalhes sobre sobre a última versão, funcionalidades a serem incor-
poradas, e outras informações para tornar o trabalho ou a diversão com o PostgreSQL mais produtiva.
Listas de discussão
As listas de discussão são um bom lugar para se conseguir ter as perguntas respondidas, para trocar exper-
iência com outros usuários, e para fazer contato com os desenvolvedores. Consulte a seção User’s Lounge6
do sítio na Web do PostgreSQL para obter mais informações.
Você mesmo!
O PostgreSQL é um trabalho de código aberto e, por isso, depende do apoio permanente da comunidade de
usuários. Quando começamos a utilizar o PostgreSQL dependemos da ajuda de outros, tanto através da docu-
mentação quanto das listas de discussão. Considere então em retribuir seus conhecimentos. Se você aprender
alguma coisa que não faz parte da documentação, escreva e contribua. Se você adicionar funcionalidades ao
código, contribua com estas funcionalidades.
Mesmo àqueles que não possuem muita experiência podem fazer correções e pequenas alterações na docu-
mentação, e esta é uma boa maneira de se começar. A lista de discussão <[email protected]>
é um lugar para se visitar com freqüência (N.T. - No Brasil veja PostgreSQL Brasil7).
5. Terminologia e notação
Um administrador normalmente é a pessoa responsável pela instalação e funcionamento do servidor. Um usuário
pode ser qualquer um usando, ou querendo usar, qualquer parte do sistema PostgreSQL. Estes termos não devem
ser interpretados ao pé da letra; este conjunto de documentos não estabelece premissas sobre os procedimentos
do administrador do sistema.
É utilizado /usr/local/pgsql/ como sendo o diretório raiz da instalação e /usr/local/pgsql/data como
o diretório contendo os arquivos dos banco de dados. Estes diretórios podem ser outros em sua máquina, os
detalhes podem ser vistos no Guia do Administrador (N.T. /var/lib/pgsql/ e /var/lib/pgsql/data no
Mandrake Linux).
Na sinopse dos comandos os colchetes ([]) indicam uma frase ou palavra chave opcional. Qualquer coisa entre
chaves ({}) contendo, também, barras verticais (|), indica que uma das alternativas deve ser escolhida.
Os exemplos mostram comandos executados a partir de várias contas e programas. Os comandos executados a
partir de uma “shell” do Unix podem estar precedidos por um caractere de cifrão (“$”). Os comandos executados a
partir da conta de um usuário, tal como root ou postgres, são especialmente sinalizados e explicados. Os comandos
SQL podem estar precedidos por “=>” ou não ter nada os precedendo, dependendo do contexto.
5. http://www.postgresql.org
6. http://www.postgresql.org/users-lounge/
7. http://br.groups.yahoo.com/group/postgresql-br/
v
Prefácio
Nota: A notação para sinalizadores de comandos não é totalmente consistente através do conjunto de
documentos. Por favor relate os problemas encontrados para a lista de discussão da documentação em
<[email protected]>.
• O programa termina com um erro fatal, ou com uma mensagem de erro do sistema operacional que aponta
para um erro no programa (um exemplo oposto seria uma mensagem de “disco cheio”, uma vez que o próprio
usuário deve corrigir este problema).
• O programa produz uma saída errada para uma entrada específica.
• O programa se recusa a aceitar uma entrada válida (conforme definido na documentação).
• O programa aceita uma entrada inválida sem enviar uma mensagem de erro. Porém, tenha em mente que a sua
idéia de entrada errada pode ser a nossa idéia de uma extensão, ou a compatibilidade com a prática tradicional.
• O PostgreSQL falha ao compilar, montar ou instalar de acordo com as instruções, em uma plataforma suportada.
Aqui “programa” se refere a qualquer executável, e não apenas ao processo servidor.
Estar lento ou consumir muitos recursos não é necessariamente um erro. Leia a documentação ou faça perguntas
em alguma lista de discussão para pedir ajuda para ajustar seus aplicativos. Não agir de acordo com o padrão
SQL também não é necessariamente um erro, a menos que a aderência com a funcionalidade específica esteja
explicitamente declarada.
Antes de prosseguir, verifique a lista TODO (a fazer) e a FAQ para ver se o seu erro já não é conhecido. Se
você não conseguir decodificar a informação da lista TODO, relate seu problema. O mínimo que podemos fazer
é tornar a lista TODO mais clara.
vi
Prefácio
• A seqüência exata dos passos, desde o início do programa, necessários para reproduzir o problema. Isto deve
estar autocontido; não é suficiente enviar apenas um comando SELECT sem enviar os comandos CREATE
TABLE e INSERT que os precederam, se a saída depender dos dados contidos nas tabelas. Nós não temos
tempo para realizar a engenharia reversa do esquema do seu banco de dados e, se nós tivermos que criar os
nossos próprios dados, nós provavelmente não vamos conseguir reproduzir o problema. O melhor formato para
realizar um caso de teste, para problemas relacionados com a linguagem de consulta, é um arquivo que possa
ser executado a partir do aplicativo psql e que mostre o problema (certifique-se de que não exista nada em seu
arquivo de inicialização ~/.psqlrc). Uma maneira fácil de começar este arquivo é usar o pg_dump para gerar
as declarações da tabela e dos dados necessários para montar o cenário, e depois incluir a consulta problemática.
Encorajamos você a minimizar o tamanho de seu exemplo, mas isto não é absolutamente necessário. Se o erro
for reproduzível, nós o encontraremos de qualquer forma.
Se o seu aplicativo utiliza alguma outra interface no cliente tal como o PHP então, por favor, tente isolar
a consulta problemática. Provavelmente nós não vamos configurar um servidor Web para reproduzir o seu
problema. De qualquer maneira lembre-se de fornecer os arquivos de entrada exatos, e não suponha que o
problema aconteça com “arquivos grandes” ou “bancos de dados de tamanho médio”, etc... uma vez que estas
informações são muito imprecisas para que possam ser utilizadas.
• A saída produzida. Por favor, não diga que “não funcionou” ou que “deu pau”. Se houver uma mensagem
de erro mostre-a, mesmo que você não consiga entendê-la. Se o programa terminar com um erro do sistema
operacional, diga qual. Se nada acontecer, informe. Mesmo que o resultado do seu caso de teste seja o tér-
mino anormal do programa, ou seja óbvio de alguma outra maneira, pode ser que isto não aconteça em nossa
plataforma. A coisa mais fácil a ser feita é copiar a saída do terminal, se for possível.
Nota: No caso de erros fatais a mensagem de erro informada pelo cliente pode não conter toda a infor-
mação disponível. Por favor, olhe também o log produzido no servidor de banco de dados. Se você não
mantém a saída do log do servidor, esta é uma boa hora para começar a fazê-lo.
• A saída esperada é uma informação importante a ser declarada. Se você escreve apenas “Este comando produz
esta saída.” ou “Isto não é o que eu esperava.”, nós podemos executar, olhar a saída, e achar que está tudo
correto e é exatamente o que nós esperávamos que fosse. Nós não temos que perder tempo para decodificar a
semântica exata por trás de seus comandos. Abstenha-se especialmente de dizer meramente “Isto não é o que
o SQL diz ou o que o Oracle faz”. Pesquisar o comportamento correto do SQL não é uma tarefa divertida, nem
nós sabemos como todos os outros bancos de dados relacionais existentes se comportam (se o seu problema é
o término anormal de seu programa, este item obviamente pode ser omitido).
• Qualquer opção de linha de comando e outras opções de inicialização, incluindo as variáveis de ambiente
relacionadas ou arquivos de configuração que foram mudados com relação ao padrão. Novamente, seja exato.
vii
Prefácio
Se estiver sendo utilizada uma distribuição pré-configurada que inicializa o servidor de banco de dados durante
o boot, deve-se tentar descobrir como isto é feito.
• Qualquer coisa feita que seja diferente das instruções de instalação.
• A versão do PostgreSQL. Pode-se executar o comando SELECT version(); para descobrir a versão do servi-
dor ao qual se está conectado. A maioria dos programas executáveis suporta a opção --version; ao menos
postmaster --version e psql --version devem funcionar. Se a função ou as opções não existirem, en-
tão a versão sendo usada é muito antiga e merece ser atualizada. Também pode ser visto o arquivo README no
diretório fonte, ou o arquivo com o nome da distribuição ou o nome do pacote. Se a versão for pré-configurada,
como RPMs, informe, incluindo qualquer sub-versão que o pacote possa ter. Se estiver se referindo a uma
versão do CVS isto deve ser mencionado, incluindo a data e a hora.
Se a sua versão for anterior a 7.3.2 provavelmente nós lhe pediremos que atualize. Existem toneladas de cor-
reções de erro a cada nova liberação, sendo este o motivo das novas liberações.
• Informações da plataforma. Isto inclui o nome do núcleo e a versão, a biblioteca C, o processador e a memória.
Na maioria dos casos é suficiente informar o fornecedor e a versão, mas não se deve assumir que todo mundo
sabe exatamente o que o “Debian” contém, ou que todo mundo use Pentium. Se houver problemas de instalação
então as informações sobre compilador, make, etc... também são necessárias.
Não tenha medo que seu relatório de erro se torne muito longo. Este é um fato da vida. É melhor relatar tudo da
primeira vez do que nós termos que extrair os fatos de você. Por outro lado, se os seus arquivos de entrada são
enormes, é justo perguntar primeiro se alguém está interessado em vê-los.
Não perca todo o seu tempo tentando descobrir que mudanças na sua entrada fazem o problema desaparecer. Isto
provavelmente não vai ajudar a resolver o problema. Se for visto que o erro não pode ser corrigido imediatamente,
você ainda vai ter tempo para compartilhar sua descoberta com os outros. Também, novamente, não perca seu
tempo advinhando porque o erro existe. Nós o encontraremos brevemente.
Ao escrever o relatório de erro, por favor escolha uma terminologia que não confunda. O pacote de software
em seu todo é chamado de “PostgreSQL” e, algumas vezes, de “Postgres” para abreviar. Se estiver se referindo
especificamente ao processo servidor mencione isto, não diga apenas que o “PostgreSQL caiu”. A queda de
um único processo do servidor é bem diferente da queda do processo “postmaster” pai; por favor não diga “o
postmaster caiu” quando um único processo servidor caiu, nem o contrário. Além disso os programas cliente,
como o terminal interativo “psql”, são completamente separados do servidor. Por favor, tente especificar se o
problema está no lado do cliente ou no lado do servidor.
viii
Prefácio
gostamos de manter os relatórios de erro em separado. Nós podemos decidir discutir o seu relatório de erro em
pgsql-hackers, se o problema necessitar uma maior averiguação.
Se você tiver problema com a documentação, o melhor lugar para relatar é na lista de discussão da documentação
em <[email protected]>. Por favor, seja específico sobre qual parte da documentação você está
descontente. (N.T. Informe os erros encontrados na tradução deste manual a <[email protected]>)
Se o seu erro for algum problema de portabilidade ou uma plataforma não suportada, envie uma mensagem
de correio eletrônico para <[email protected]>, para que nós (e você) possamos trabalhar para
portar o PostgreSQL para esta plataforma.
Nota: Devido à grande quantidade de spam na Internet, todos os endereços de correio eletrônico acima são
de listas de discussão fechadas. Ou seja, você precisa subscrever a lista primeiro para depois poder enviar
mensagens (entretanto, você não precisa subscrever para utilizar o formulário de relatório de erro da Web).
Se você deseja enviar uma mensagem de correio eletrônico, mas não deseja receber o tráfego da lista, você
pode subscrever e configurar sua opção de subscrição com nomail. Para maiores informações envie uma
mensagem para <[email protected]> contendo apenas a palavra help no corpo da mensagem.
ix
Capítulo 1. Iniciando
1.1. Instalação
Antes de poder usar o PostgreSQL este deve estar instalado, é claro. É possível que o PostgreSQL já esteja instal-
ado em sua máquina, seja porque está incluído na distribuição do sistema operacional, ou porque o administrador
do sistema fez a instalação. Se este for o caso, deve-se obter informações na documentação do sistema operacional
ou com o administrador do sistema sobre como acessar o PostgreSQL.
Se você não tiver certeza que o PostgreSQL está disponível, ou que pode ser usado para os seus experimentos,
você poderá fazer a instalação por si mesmo. Proceder desta maneira não é difícil e pode ser um bom exercício.
O PostgreSQL pode ser instalado por qualquer usuário sem privilégios, porque nenhum acesso de super-usuário
(root) é necessário.
Se você for instalar o PostgreSQL por si mesmo, então consulte o Guia do Administrador do PostgreSQL para ler
as instruções de instalação, e depois retorne para este manual quando a instalação estiver completa. Certifique-se
de seguir de perto a seção relativa à configuração das variáveis de ambiente apropriadas.
Se o administrador do sistema não fez a configuração conforme o padrão, talvez algum trabalho adicional deva
ser feito. Por exemplo, se a máquina servidora de banco de dados for uma máquina remota, será necessário definir
a variável de ambiente PGHOST com o nome da máquina servidora de banco de dados. A variável de ambiente
PGPORT talvez também tenha que ser definida. A regra básica é esta: se você tentar iniciar um programa aplicativo
e este informar que não pode se conectar ao banco de dados, você deve consultar o administrador do servidor ou,
caso seja você mesmo, a documentação para ter certeza de que o seu ambiente está corretamente configurado. Se
você não entendeu o parágrafo anterior então, por favor, leia a próxima seção.
• Um processo servidor, o qual gerencia os arquivos do banco de dados, aceita as conexões dos aplicativos cliente
com o banco de dados, e executa as ações no banco de dados em nome dos clientes. O programa servidor de
banco de dados chama-se postmaster.
• O aplicativo cliente do usuário (frontend) que deseja executar operações de banco de dados. Os aplicativos
cliente podem ter naturezas muito diversas: o cliente pode ser uma ferramenta no modo caractere, um aplica-
tivo gráfico, um servidor Web que acessa o banco de dados para mostrar páginas da Web, ou uma ferramenta
especializada para manutenção do banco de dados. Alguns aplicativos cliente são fornecidos junto com a dis-
tribuição do PostgreSQL, sendo a maioria desenvolvida pelos usuários.
É típico em aplicativos cliente-servidor o cliente e o servidor estarem em máquinas diferentes. Neste caso eles se
comunicam através de uma conexão de rede TCP/IP. Deve-se ter isto em mente, porque arquivos que podem ser
acessados na máquina cliente podem não ser acessíveis (ou podem somente ser acessíveis usando um nome de
arquivo diferente) pela máquina servidora.
O servidor PostgreSQL pode tratar múltiplas conexões concorrentes dos clientes. Para esta finalidade é iniciado
(“fork”) um novo processo para cada conexão. Deste ponto em diante, o cliente e o novo processo servidor passam
1
Capítulo 1. Iniciando
a se comunicar sem a intervenção do processo original postmaster. Portanto, o postmaster está sempre ex-
ecutando aguardando por novas conexões dos clientes, enquanto os processos servidores associados aos clientes
surgem e desaparecem (tudo isso, obviamente, é invisível para o usuário sendo somente mencionado para ficar
completo).
$ createdb meu_bd
CREATE DATABASE
Se isto acontecer, esta etapa foi executada com sucesso e o resto da seção pode ser saltada.
Se aparecer uma mensagem parecida com
então o PostgreSQL não foi instalado adequadamente. Ou não foi instalado, ou o caminho de procura não está
correto. Tente executar o comando utilizando o caminho absoluto:
$ /usr/local/pgsql/bin/createdb meu_bd
O caminho na sua máquina pode ser diferente (N.T. /usr/bin/createdb no Mandrake Linux). Faça contato com o
administrador ou verifique novamente as instruções de instalação para corrigir a situação.
Outra resposta pode ser esta:
Isto indica que o servidor não foi inicializado, ou que não foi inicializado aonde o createdb esperava que
estivesse. Novamente, verifique as instruções de instalação ou consulte o administrador.
Se você não possuir o privilégio necessário para criar bancos de dados, a seguinte mensagem será exibida:
Nem todo usuário possui autorização para criar novos bancos de dados. Se o PostgreSQL recusar a criação do
banco de dados, então o administrador deve conceder a permissão para criar bancos de dados para você. Consulte
2
Capítulo 1. Iniciando
o administrador caso isto ocorra. Se você instalou o PostgreSQL por si mesmo, então você deve se logar usando
a mesma conta utilizada para inicializar o servidor para poder usar este tutorial. 1
Você também pode criar bancos de dados com outros nomes. O PostgreSQL permite a criação de qualquer número
de bancos de dados em uma instalação. Os nomes dos bancos de dados devem ter um primeiro caractere alfabético,
estando limitados a um comprimento de 63 caracteres. Uma escolha conveniente é criar o banco de dados com o
mesmo nome de seu usuário corrente. Muitas ferramentas assumem este nome de banco de dados como sendo o
padrão, evitando a necessidade de digitá-lo. Para criar este banco de dados digite simplesmente
$ createdb
Se você não deseja mais utilizar o seu banco de dados você pode removê-lo. Por exemplo, se você for o dono
(criador) do banco de dados meu_bd, você poderá removê-lo utilizando o seguinte comando:
$ dropdb meu_bd
Para este comando o nome da conta não é utilizado como o nome padrão do banco de dados, o nome sempre deve
ser especificado. Esta ação remove fisicamente todos os arquivos associados ao banco de dados e não pode ser
desfeita, portanto esta operação somente deve ser feita após um longo período de reflexão.
• Execução do programa de terminal interativo do PostgreSQL chamado psql, que permite a entrada, edição e
execução de comandos SQL interativos.
• Utilização de uma ferramenta cliente gráfica existente como o PgAccess, ou de um pacote de automação de
escritórios com suporte a ODBC para criar e manusear bancos de dados. Estas possibilidades não estão cobertas
neste tutorial.
• Criação de aplicativos personalizados, usando uma das várias ligações com linguagens disponíveis. Estas pos-
sibilidades são discutidas com mais detalhe no Guia do Programador do PostgreSQL.
Você provavelmente deseja iniciar o psql para executar os exemplos deste tutorial. O psql pode ser ativado para
usar o banco de dados meu_bd digitando o seguinte comando:
$ psql meu_bd
Se o nome do banco de dados for omitido, então o padrão fica sendo o nome da conta de seu usuário. Você já viu
este esquema na seção anterior.
No psql você vai ser saudado com a seguinte mensagem:
1. Uma explicação de porque isto funciona: Os nomes dos usuários do PostgreSQL são distintos dos nomes das contas do
sistema operacional. Ao se conectar com um banco de dados pode ser escolhido o nome do usuário do PostgreSQL que deseja
se conectar como; Se isto não for feito isto, o padrão é utilizar o mesmo nome da conta atual do sistema operacional. Como
isto ocorre, sempre existirá uma conta de usuário do PostgreSQL que possui o mesmo nome do usuário do sistema operacional
que inicializou o servidor e acontece, também, que este usuário sempre tem permissão para criar bancos de dados. Em vez
de se logar como o usuário pode ser especificada a opção -U em todos os aplicativos para escolher o nome do usuário do
PostgreSQL que se deseja conectar como.
3
Capítulo 1. Iniciando
meu_bd=>
meu_bd=#
Isto significa que você é um super-usuário do banco de dados, o que acontece geralmente quando você instala o
PostgreSQL por si mesmo. Sendo um super-usuário significa que você não está sujeito a controles de acesso. Para
as finalidades deste tutorial isto não tem importância.
Se você teve problemas ao inicializar o psql, então retorne à seção anterior. Os diagnósticos do psql e do
createdb são similares, e se um funcionou o outro deve funcionar também.
A última linha exibida pelo psql é o prompt, indicando que o psql está aguardando você, e que você pode
digitar comandos SQL dentro do espaço de trabalho mantido pelo psql. Tente usar estes comando:
meu_bd=> SELECT 2 + 2;
?column?
----------
4
(1 row)
O programa psql possui vários comandos internos que não são comandos SQL. Eles começam pelo caractere de
contrabarra, “\”. Alguns destes comandos são mostrados na mensagem de boas vindas. Por exemplo, pode ser
obtida ajuda na sintaxe de vários comandos SQL do PostgreSQL digitando-se:
meu_bd=> \h
meu_bd=> \q
e o psql vai terminar e retornar para a linha de comando do sistema operacional (para conhecer outros comandos
internos digite \? no prompt do psql). Todas as funcionalidades do psql estão documentadas no Manual de
Referência do PostgreSQL. Se o PostgreSQL estiver instalado corretamente, você também poderá digitar man
psql na linha de comando do sistema operacional para ver a documentação. Neste tutorial nós não vamos utilizar
estas funcionalidades explicitamente, mas você poderá usá-las por si próprio quando julgar adequado.
4
Capítulo 2. A linguagem SQL
2.1. Introdução
Este capítulo contém uma revisão sobre como utilizar a linguagem SQL para realizar operações simples. Este
tutorial tem apenas o propósito de fazer uma introdução e, de forma alguma, é um tutorial completo sobre a
linguagem SQL. Muitos livros foram escritos sobre o SQL, incluindo o Understanding the New SQL e A Guide
to the SQL Standard. Você deve ficar ciente de que alguma funcionalidades da linguagem no PostgreSQL são
extensões ao padrão.
Nos exemplos a seguir é assumido que você tenha criado o banco de dados chamado meu_bd, conforme descrito
no capítulo anterior, e que tenha ativado o psql.
Os exemplos presentes neste manual também podem ser encontrados no fonte da distribuição do PostgreSQL no
diretório src/tutorial/. Consulte o arquivo README neste diretório para saber como usá-los. Para iniciar o
tutorial (em inglês) faça o seguinte:
$ cd ..../src/tutorial
$ psql -s mydb
...
mydb=> \i basics.sql
O comando \i lê os comandos no arquivo especificado. A opção -s ativa o modo passo a passo, que faz uma pausa
antes de enviar cada comando para o servidor. Os comandos utilizados nesta seção estão no arquivo basics.sql.
2.2. Conceitos
O PostgreSQL é um sistema de gerenciamento de banco de dados relacional (SGBDR). Isto significa que é um
sistema para gerenciar dados armazenados em relações. Uma relação é essencialmente um termo matemático para
tabela. A noção de armazenar dados em tabelas é um lugar tão comum hoje em dia que pode parecer totalmente
óbvio, mas existem várias outras maneiras de se organizar bancos de dados. Arquivos e diretórios em sistemas
operacionais tipo Unix são um exemplo de banco de dados hierárquico. Um desenvolvimento mais moderno são
os bancos de dados orientados a objeto.
Cada tabela é uma coleção nomeada de linhas. Cada linha de uma determinada tabela possui o mesmo conjunto
de colunas nomeadas, e cada coluna é de um tipo de dado específico. Enquanto as colunas possuem uma ordem
fixa em cada linha, é importante lembrar que o SQL não garante a ordem das linhas dentro de uma tabela (embora
as linhas possam ser explicitamente ordenadas para a exibição).
As tabelas são agrupadas em bancos de dados, e uma coleção de bancos de dados gerenciada por uma única
instância do servidor PostgreSQL constitui um agrupamento de bancos de dados.
5
Capítulo 2. A linguagem SQL
O comando pode ser digitado no psql com as quebras de linha. O psql vai reconhecer que o comando ainda não
terminou até encontrar o ponto-e-vírgula.
Espaços em branco (ou seja, espaços, tabulações e novas linhas) podem ser utilizadas livremente nos comandos
SQL. Isto significa que o comando pode ser digitado com um alinhamento diferente do mostrado acima, ou
mesmo todo em uma única linha. Dois hífens (“--”) introduzem um comentário. Tudo que segui-los é ignorado
até o final da linha. O SQL não diferencia letras maiúsculas e minúsculas nas palavras e nos identificadores, a não
ser quando os identificadores estão entre aspas (") para preservar letras maiúsculas e minúsculas (o que não foi
feito acima).
O varchar(80) especifica um tipo de dado que pode armazenar cadeias de caracteres arbitrárias com um com-
primento de até 80 caracteres; O int é o tipo inteiro normal; O real é um tipo para armazenar números de ponto
flutuante de precisão simples; date é para armazenar data e hora (a coluna do tipo date poderia se chamar date,
o que tanto pode ser conveniente quanto pode causar confusão).
O PostgreSQL suporta os tipos SQL usuais int, smallint, real, double precision, char(N ),
varchar(N ), date, time, timestamp e interval, assim bem como outros tipos de utilidade geral e um
abrangente conjunto de tipos geométricos. O PostgreSQL pode ser personalizado com um número arbitrário de
tipos definidos pelo usuário. Como conseqüência os nomes dos tipos não são sintaticamente palavras chaves,
exceto onde for requerido para suportar casos especiais no padrão SQL.
No segundo exemplo são armazenadas as cidades e suas localizações geográficas:
INSERT INTO clima VALUES (’São Francisco’, 46, 50, 0.25, ’1994-11-27’);
Repare que todos os tipos de dados usam formatos de entrada de dados bastante óbvios. As constantes, que não
são apenas valores numéricos, geralmente devem estar entre apóstrofos (’), como no exemplo acima. O tipo
date na verdade é muito flexível com relação aos dados que aceita, mas para este tutorial será utilizado o formato
mostrado acima porque não possui ambigüidade.
O tipo point requer um par de coordenadas como entrada, como mostrado abaixo:
6
Capítulo 2. A linguagem SQL
A sintaxe usada anteriormente requer que seja lembrada a ordem das colunas. Uma sintaxe alternativa permite
relacionar as colunas explicitamente:
As colunas podem ser listadas em uma ordem diferente se for desejado, ou até mesmo omitir algumas colunas.
Por exemplo, se a precipitação for desconhecida:
Muitos desenvolvedores consideram relacionar explicitamente as colunas um estilo melhor do que confiar na
ordem implícita.
Por favor, entre todos os comando mostrados acima para ter alguns dados com que trabalhar nas próximas seções.
Também pode ser utilizado o comando COPY para carregar uma grande quantidade de dados a partir de arquivos
de texto. Geralmente isto é mais rápido porque o comando COPY é otimizado para esta finalidade, embora possua
menos flexibilidade do que o comando INSERT. Um exemplo poderia ser:
onde o arquivo de origem deve poder ser acessado pelo servidor e não pelo o cliente, uma vez que o servidor
lê o arquivo diretamente. Pode-se obter mais informações sobre o comando COPY no Manual de Referência do
PostgreSQL.
Pode ser especificada qualquer expressão arbitrária na lista de seleção. Por exemplo, pode-se escrever:
7
Capítulo 2. A linguagem SQL
Perceba que a cláusula AS foi utilizada para mudar o nome da coluna de saída (é opcional).
Operadores booleanos arbitrários (AND, OR e NOT) são permitidos na qualificação da consulta. Por exemplo, o
comando abaixo obtém o clima de São Francisco nos dias de chuva:
Resultado:
Como nota final, pode-se desejar que os resultados de uma seleção retornem em uma determinada ordem, ou com
as linhas duplicadas removidas:
cidade
---------------
Hayward
São Francisco
(2 rows)
Nota: Este é apenas um modelo conceitual, a junção real pode ser realizada de uma maneira mais eficiente,
mas isto não é visível para o usuário.
SELECT *
FROM clima, cidades
WHERE cidade = nome;
8
Capítulo 2. A linguagem SQL
• Não existe nenhuma linha para a cidade Hayward. Isto é porque não existe entrada correspondente na tabela
cidades para Hayward, portanto a junção ignora as linhas da tabela clima sem correspondência. Nós veremos
em breve como isto pode ser mudado.
• Existem duas colunas contendo o nome da cidade. Isto está correto porque a relação de colunas das tabelas
clima e cidades estão concatenadas. Na prática isto não é o que se deseja e, portanto, é preferível escrever a
lista das colunas de saída explicitamente em vez de utilizar o *:
SELECT cidade, temp_min, temp_max, prcp, data, localizacao
FROM clima, cidades
WHERE cidade = nome;
Exercício: Tente descobrir a semântica desta consulta quando a cláusula WHERE é omitida.
Uma vez que todas as colunas possuem nomes diferentes, o analisador encontra automaticamente a tabela que a
coluna pertence, mas é um bom estilo qualificar completamente os nomes das colunas nas consultas de junção:
As consultas de junção do tipo visto até agora também poderiam ser escritas da seguinte forma alternativa:
SELECT *
FROM clima INNER JOIN cidades ON (clima.cidade = cidades.nome);
A utilização desta sintaxe não é tão comum quanto das demais acima, mas é mostrada aqui para que sejam
entendidos os próximos tópicos.
Agora nós vamos descobrir como se faz para obter os registros de Hayward. O que nós queremos que seja feito
é varrer a tabela clima, e para cada linha encontrar a linha correspondente em cidades. Se nenhuma linha for
encontrada, nós queremos que algum “valor vazio” seja colocado nas colunas da tabela cidades. Este tipo de
consulta é chamado de junção externa (outer join). As consultas vistas até agora são junções internas (inner
join). O comando então fica assim:
SELECT *
FROM clima LEFT OUTER JOIN cidades ON (clima.cidade = cidades.nome);
9
Capítulo 2. A linguagem SQL
Esta consulta é chamada de junção externa esquerda (left outer join) porque a tabela mencionada à es-
querda do operador de junção terá cada uma de suas linhas aparecendo na saída ao menos uma vez, enquanto que
a tabela à direita vai ter somente as linhas que correspondem a alguma linha da tabela à esquerda aparecendo. Ao
listar uma linha da tabela à esquerda, para a qual não existe nenhuma linha correspondente na tabela à direita,
valores vazios (null) são colocados nas colunas da tabela à direita.
Exercício: Existe também a junção externa direita (right outer join) e a junção externa completa (full
outer join). Tente descobrir o que fazem.
Também é possível fazer a junção da tabela com si mesma. Isto é chamado de autojunção (self join). Como
exemplo, suponha que nós desejamos descobrir todos os registro de clima que estão no intervalo de temperatura
de outros registros de clima. Portanto, nós precisamos comparar as colunas temp_min e temp_max de cada linha
de clima com as colunas temp_min e temp_max de todas as outras linhas da tabela clima. Nós podemos fazer
isto utilizando a seguinte consulta:
A tabela clima teve o seu nome mudado para C1 e C2 para que se possa distinguir o lado esquerdo e o direito
da junção. Estes “aliases” também podem ser utilizados em outras consultas para reduzir a digitação como, por
exemplo:
SELECT *
FROM clima w, cidades c
WHERE w.cidade = c.nome;
max
-----
46
(1 row)
Se desejarmos saber em que cidade (ou cidades) esta leitura ocorreu, podemos tentar
10
Capítulo 2. A linguagem SQL
mas não vai funcionar porque a função de agregação max não pode ser usada na cláusula WHERE (Esta restrição
existe porque a cláusula WHERE determina as linhas que passarão para o estágio de agregação; portanto tem que
ser avaliada antes das funções de agregação serem computadas). Entretanto, como é geralmente o caso, a consulta
pode ser reformulada para obter o resultado pretendido, o que será feito aqui através de uma subconsulta:
cidade
---------------
São Francisco
(1 row)
Isto está correto porque a subconsulta é uma ação independente, que calcula a sua própria agregação separada-
mente do que está acontecendo na consulta externa.
As agregações também são muito úteis quando combinadas com a cláusula GROUP BY. Por exemplo, pode ser
obtida a maior temperatura mínima observada em cada cidade com
cidade | max
-----------------+-----
Hayward | 37
São Francisco | 46
(2 rows)
o que produz uma linha de saída para cada cidade. Cada resultado da agregação é calculado sobre as linhas da
tabela que correspondem a uma cidade. Estas linhas agrupadas podem ser filtradas utilizando a cláusula HAVING:
cidade | max
-----------+-----
Hayward | 37
(1 row)
que nos fornece o mesmo resultado apenas para as cidades que possuam todos os valores de temp_min abaixo de
40. Finalmente, se nós desejamos somente as cidade que começam com a letra “S”, podemos escrever
11
Capítulo 2. A linguagem SQL
É importante compreender a interação entre as agregações e as cláusulas WHERE e HAVING do SQL. A diferença
fundamental entre WHERE e HAVING é esta: o WHERE seleciona as linhas de entrada antes dos grupos e agregações
serem computados (portanto, controla quais linhas irão para o computo da agregação), enquanto que o HAVING
seleciona grupos de linhas após os grupos e agregações serem computados. Portanto, a cláusula WHERE não pode
conter funções de agregação; não faz sentido tentar utilizar uma agregação para determinar quais linhas serão a en-
trada da agregação. Por outro lado, a cláusula HAVING sempre possui função de agregação (Falando estritamente,
é permitido escrever uma cláusula HAVING que não possua agregação, mas é desperdício: A mesma condição
poderia ser utilizada de forma mais eficiente no estágio do WHERE).
Observe que a restrição do nome da cidade poderia ser colocada na cláusula WHERE, uma vez que não necessita de
nenhuma agregação. Isto é mais eficiente do que colocar a restrição na cláusula HAVING, porque evita que sejam
feitos os procedimentos de agrupamento e agregação para todas as linhas que não atendem a cláusula WHERE.
2.8. Atualizações
As linhas existentes podem ser atualizadas usando-se o comando UPDATE. Suponha que seja descoberto que
as leituras de temperatura estejam todas 2 graus acima após 28 de Novembro de 1994. Estes dados podem ser
corrigidos da seguinte maneira:
UPDATE clima
SET temp_max = temp_max - 2, temp_min = temp_min - 2
WHERE data > ’1994-11-28’;
2.9. Exclusões
Suponha que nós não estamos mais interessados nos dados do clima em Hayward. Então precisamos excluir estas
linhas da tabela. As exclusões são realizadas através do comando DELETE:
12
Capítulo 2. A linguagem SQL
(2 rows)
Sem uma qualificação, o comando DELETE remove todas as linhas de uma dada tabela, deixando-a vazia. O
sistema não vai solicitar uma confirmação antes de realizar esta operação!
13
Capítulo 3. Funcionalidades avançadas
3.1. Introdução
Nos capítulos anteriores foram descritas funcionalidade básicas da utilização do SQL para armazenamento e
acesso aos dados no PostgreSQL. Agora serão discutidas funcionalidades mais avançadas do SQL que simplificam
a gerência e evitam a perda e a corrupção dos dados. Ao final serão vistas algumas extensões do PostgreSQL.
Este capítulo em certas ocasiões faz referência aos exemplos encontrados no Capítulo 2 para modificá-los ou
melhorá-los, portanto é aconselhável que você já tenha lido este capítulo. Alguns exemplos deste capítulo também
podem ser encontrados no arquivo advanced.sql no diretório do tutorial. Este arquivo também contém alguns
dados de exemplo a serem carregados, que não serão repetidos aqui (consulte a Seção 2.1 para saber como usar
este arquivo).
3.2. Visões
Reveja as consultas na Seção 2.6. Suponha que a consulta combinando os registros de clima e de localização das
cidades seja de particular interesse para o seu aplicativo, mas que você não deseja digitar esta consulta toda vez
que necessitar dela. Pode-se então criar uma visão baseada na consulta, a qual dá um nome à consulta, através do
qual pode ser feita referência como se fosse uma tabela comum.
Fazer livre uso de visões é um aspecto chave de um bom projeto de banco de dados SQL. As visões permitem
encapsular os detalhes da estrutura das tabelas, que podem mudar na medida em que os aplicativos evoluem, atrás
de interfaces consistentes.
As visões podem ser utilizadas em praticamente todos os lugares em que uma tabela pode ser utilizada. Construir
visões baseadas em visões não é raro.
14
Capítulo 3. Funcionalidades avançadas
localizacao point
);
ERROR: <unnamed> referential integrity violation - key referenced from clima not found in cid
O comportamento das chaves estrangeiras pode receber um ajuste fino na aplicação. Não iremos além deste
exemplo simples neste tutorial, mas consulte o Guia do Usuário do PostgreSQL para obter mais informações.
Usar corretamente as chaves estrangeiras com certeza vai melhorar a qualidade dos seus aplicativos de banco de
dados, portanto encorajamos muito que este tópico seja aprendido.
3.4. Transações
Transação é um conceito fundamental de todo o sistema de banco de dados. O ponto essencial de uma transação é
que esta engloba vários passos em uma única operação de tudo ou nada. Os estados dos passos intermediários não
são visíveis para as outras transações concorrentes e, se alguma falha ocorrer que impeça a transação de chegar
até o fim, então nenhum dos passos intermediários irá afetar o banco de dados de nenhuma forma.
Por exemplo, considere um banco de dados de uma instituição financeira que contém o saldo da conta corrente de
vários clientes, assim como o saldo total dos depósitos de cada agência. Suponha que se deseje transferir $100.00
da conta da Alice para a conta do Bob. Simplificando barbaramente, os comandos SQL para esta operação seriam:
Os detalhes destes comandos não são importantes aqui; o importante é que existem várias atualizações separadas
envolvidas para realizar esta operação bem simples. A contabilidade do banco quer ter certeza que todas as
atualizações são realizadas, ou que nenhuma delas acontece. Não é interessante uma falha no sistema fazer com
que Bob receba $100.00 que não foi debitado da Alice. A Alice também não vai continuar sendo uma cliente
satisfeita se o dinheiro for debitado da conta dela e não for creditado na de Bob. É necessário garantir que se
algo der errado no meio da operação, nenhum dos passos executados até então surtam efeito. Agrupando-se estas
atualizações em uma transação nos dá esta garantia. Uma transação é dita como sendo atômica: do ponto de vista
das outras transações, ou ela acontece plenamente ou nada acontece.
15
Capítulo 3. Funcionalidades avançadas
Desejamos também a garantia de uma vez que a transação esteja completa e aceita pelo sistema de banco de dados,
que fique permanentemente gravada e não seja perdida mesmo no caso de uma pane acontecer logo em seguida.
Por exemplo, se estiver sendo registrado um saque em dinheiro pelo Bob, não é desejado de forma alguma que o
débito em sua conta corrente desapareça devido a uma pane ocorrida logo depois dele sair do banco. Um banco
de dados transacional garante que todas as atualizações feitas por uma transação estão registradas em um meio de
armazenamento permanente (ou seja, em disco) antes da transação ser considerada completa.
Uma outra propriedade importante dos bancos de dados transacionais está muito ligada à noção de atualizações
atômicas: quando várias transações estão executando ao mesmo tempo, cada uma delas não deve enxergar as
mudanças intermediárias efetuadas pelas outras. Por exemplo, se uma transação está ocupada totalizando o saldo
de todas as agências, não pode ser visto o débito efetuado na agência da Alice mas ainda não creditado na agência
do Bob, nem o contrário. Portanto, as transações não devem ser tudo ou nada apenas em termos de seu efeito
permanente no banco de dados, mas também em termos de visibilidade durante o processamento. As atualizações
feitas por uma transação não podem ser vistas pelas outras transações enquanto esta não terminar, quando todas
as atualizações se tornam visíveis ao mesmo tempo.
No PostgreSQL uma transação é definida cercando-se os comandos SQL da transação com os comandos BEGIN
e COMMIT. Sendo assim, a nossa transação bancária ficaria:
BEGIN;
UPDATE conta_corrente SET saldo = saldo - 100.00
WHERE nome = ’Alice’;
-- etc etc
COMMIT;
Se no meio da transação for decidido que esta não deve ser concluída (talvez porque foi visto que o saldo da Alice
se tornou negativo), pode ser executado o comando ROLLBACK em vez do COMMIT, fazendo com que todas as
atualizações sejam canceladas.
O PostgreSQL na verdade trata todo comando SQL como sendo executado dentro de uma transação. Se não
for utilizado o comando BEGIN, então cada comando possui individualmente um BEGIN e um (se der tudo certo)
COMMIT em torno dele. Um grupo de comandos envolvidos por um BEGIN e um COMMIT é algumas vezes chamado
de bloco de transação.
Nota: Algumas bibliotecas cliente emitem um comando BEGIN e um comando COMMIT automaticamente,
fazendo com que se obtenha o efeito de um bloco de transação sem que seja perguntado. Verifique a docu-
mentação da interface sendo utilizada.
3.5. Herança
Herança é um conceito de banco de dados orientado a objeto que abre novas possibilidades interessantes ao projeto
de bancos de dados.
Criemos duas tabelas: uma tabela cidades e outra tabela capitais. Naturalmente as capitais também são
cidades e, portanto, deve existir alguma maneira de se mostrar implicitamente as capitais quando todas as cidades
são mostradas. Sendo bastante perspicaz pode-se criar um esquema como este:
16
Capítulo 3. Funcionalidades avançadas
estado char(2)
);
Este esquema funciona bem para as consultas, mas não é bom quando é necessário atualizar várias linhas, entre
outras coisas.
Uma solução melhor é esta:
Neste caso, uma linha de capitais herda todas as colunas (nome, populacao e altitude) de seu ancestral
cidades. O tipo da coluna nome é text, um tipo nativo do PostgreSQL para cadeias de caracteres de tamanho
variável. As capitais dos estados têm uma coluna a mais chamada estado, que guarda a sigla do estado. No
PostgreSQL uma tabela pode herdar de nenhuma ou de várias tabelas.
Por exemplo, a consulta abaixo lista os nomes de todas as cidades, incluindo as capitais dos estados, que estão
localizadas a uma altitude superior a 500 pés:
o que retorna:
nome | altitude
-----------+----------
Las Vegas | 2174
Mariposa | 1953
Madison | 845
(3 rows)
Por outro lado, a consulta abaixo lista todas as cidades que não são capitais e estão situadas a uma altitude superior
a 500 pés:
17
Capítulo 3. Funcionalidades avançadas
name | altitude
-----------+----------
Las Vegas | 2174
Mariposa | 1953
(2 rows)
Nesta consulta a palavra ONLY antes de cidades indica que a consulta deve ser efetuada somente na tabela
cidades, e não nas tabelas hierarquicamente abaixo de cidades em termos de herança. Muitos comandos dis-
cutidos até agora -- SELECT, UPDATE e DELETE -- permitem usar a notação do ONLY.
3.6. Conclusão
O PostgreSQL possui muitas funcionalidades não descritas neste tutorial introdutório, o qual está orientado para
os usuários novatos em SQL. Estas funcionalidades estão discutidas com mais detalhes no Guia do Usuário do
PostgreSQL e no Guia do Programador do PostgreSQL.
Se você achar que necessita de mais material introdutório, por favor visite o sítio do PostgreSQL na Web1 para
obter mais informações.
1. http://www.postgresql.org
18
Bibliografia
Referências e artigos selecionados para o SQL e para o PostgreSQL.
Alguns relatórios oficiais e técnicos da equipe original de desenvolvimento do POSTGRES estão disponíveis no
sítio na Web do Departamento de Ciência da Computação da Universidade da Califórnia em Berkeley.1
C. J. Date e Hugh Darwen, A Guide to the SQL Standard: A user’s guide to the standard database language SQL,
Fourth Edition, Addison-Wesley, ISBN 0-201-96426-0, 1997.
Ramez Elmasri e Shamkant Navathe, Fundamentals of Database Systems, 3rd Edition, Addison-Wesley, ISBN
0-805-31755-4, August 1999.
Jim Melton e Alan R. Simon, Understanding the New SQL: A complete guide, Morgan Kaufmann, ISBN 1-55860-
245-3, 1993.
Jeffrey D. Ullman, Principles of Database and Knowledge: Base Systems, Volume 1, Computer Science Press,
1988.
Discusses SQL history and syntax, and describes the addition of INTERSECT and EXCEPT constructs into
PostgreSQL. Prepared as a Master’s Thesis with the support of O. Univ. Prof. Dr. Georg Gottlob and Univ.
Ass. Mag. Katrin Seyr at Vienna University of Technology.
A. Yu e J. Chen, The POSTGRES Group, The Postgres95 User Manual, University of California, Sept. 5, 1995.
Zelaine Fong, The design and implementation of the POSTGRES query optimizer2, University of California,
Berkeley, Computer Science Department.
1. http://s2k-ftp.CS.Berkeley.EDU:8000/postgres/papers/
2. http://s2k-ftp.CS.Berkeley.EDU:8000/postgres/papers/UCB-MS-zfong.pdf
19
Bibliografia
Conferências e Artigos
Nels Olson, Partial indexing in POSTGRES: research project, University of California, UCB Engin T7.49.1993
O676, 1993.
L. Ong e J. Goh, “A Unified Framework for Version Modeling Using Production Rules in a Database System”,
ERL Technical Memorandum M90/33, University of California, April, 1990.
L. Rowe e M. Stonebraker, “The POSTGRES data model3”, Proc. VLDB Conference, Sept. 1987.
P. Seshadri e A. Swami, “Generalized Partial Indexes4 ”, Proc. Eleventh International Conference on Data Engi-
neering, 6-10 March 1995, IEEE Computer Society Press, Cat. No.95CH35724, 1995, p. 420-7.
M. Stonebraker, E. Hanson, e C. H. Hong, “The design of the POSTGRES rules system”, Proc. IEEE Conference
on Data Engineering, Feb. 1987.
M. Stonebraker, “The design of the POSTGRES storage system6”, Proc. VLDB Conference, Sept. 1987.
M. Stonebraker, M. Hearst, e S. Potamianos, “A commentary on the POSTGRES rules system7”, SIGMOD Record
18(3), Sept. 1989.
M. Stonebraker, “The case for partial indexes8”, SIGMOD Record 18(4), Dec. 1989, p. 4-11.
M. Stonebraker, A. Jhingran, J. Goh, e S. Potamianos, “On Rules, Procedures, Caching and Views in Database
Systems10”, Proc. ACM-SIGMOD Conference on Management of Data, June 1990.
3. http://s2k-ftp.CS.Berkeley.EDU:8000/postgres/papers/ERL-M87-13.pdf
4. http://simon.cs.cornell.edu/home/praveen/papers/partindex.de95.ps.Z
5. http://s2k-ftp.CS.Berkeley.EDU:8000/postgres/papers/ERL-M85-95.pdf
6. http://s2k-ftp.CS.Berkeley.EDU:8000/postgres/papers/ERL-M87-06.pdf
7. http://s2k-ftp.CS.Berkeley.EDU:8000/postgres/papers/ERL-M89-82.pdf
8. http://s2k-ftp.CS.Berkeley.EDU:8000/postgres/papers/ERL-M89-17.pdf
9. http://s2k-ftp.CS.Berkeley.EDU:8000/postgres/papers/ERL-M90-34.pdf
10. http://s2k-ftp.CS.Berkeley.EDU:8000/postgres/papers/ERL-M90-36.pdf
20
Index length, ?
cid, ?
cidr, ?
circle, ?
A columns
aggregate functions, ? system columns, ?
alias
col_description, ?
(Ver label)
comments
all, ?
and in SQL, ?
operator, ? comparison
any, ?, ? operators, ?
anyarray, ?
concurrency, ?
arrays, ?
constants, ? conditionals, ?
auto-increment constants, ?
(Ver serial) cstring, ?
average
currval, ?
function, ?
B D
B-tree
data types, ?
(Ver indexes)
constants, ?
between, ?
bigint, ? numeric, ?
bigserial, ? type casts, ?
binary strings date
concatenation, ?
constants, ?
length, ?
bit strings current, ?
constants, ? data type, ?
data type, ? output format, ?
Boolean
(Ver Também Formatting)
data type, ?
decimal
operators
(Ver operators, logical) (Ver numeric)
box (data type), ? dirty read, ?
distinct, ?
double precision, ?
C
case, ?
case sensitivity
SQL commands, ?
E
character strings
except, ?
concatenation, ?
exists, ?
constants, ?
data types, ?
21
Index
F intersection, ?
interval, ?
false, ?
isolation levels, ?
float4
read committed, ?
(Ver real)
read serializable, ?
float8
(Ver double precision)
floating point, ?
formatting, ?
functions, ?
J
joins, ?
cross, ?
G left, ?
natural, ?
get_bit, ?
outer, ?
get_byte, ?
group, ?
K
H
key words
hash list of, ?
(Ver indexes) syntax, ?
has_database_privilege, ?
has_function_privilege, ?
has_language_privilege, ?
has_schema_privilege, ? L
has_table_privilege, ?
label
column, ?
table, ?
I
language_handler, ?
identifiers, ? length
in, ? binary strings
indexes, ?
(Ver binary strings, length)
B-tree, ?
character strings
hash, ?
(Ver character strings, length)
multicolumn, ?
on functions, ? like, ?
partial, ? limit, ?
R-tree, ? line, ?
unique, ? locking, ?
inet (data type), ?
int2
(Ver smallint)
int4 M
(Ver integer)
MAC address
int8
(Ver bigint) (Ver macaddr)
integer, ? macaddr (data type), ?
internal, ?
22
Index
N point, ?
polygon, ?
names
qualified, ?
unqualified, ?
namespaces, ?
Q
network qualified names, ?
addresses, ? quotes
nextval, ? and identifiers, ?
nonrepeatable read, ? escaping, ?
not
operator, ?
not in, ?
nullif, ? R
numeric
R-tree
constants, ?
(Ver indexes)
numeric (data type), ?
real, ?
record, ?
regclass, ?
O regoper, ?
regoperator, ?
object identifier regproc, ?
data type, ? regprocedure, ?
obj_description, ? regtype, ?
offset regular expressions, ?, ?
with query results, ? (Ver Também pattern matching)
OID, ?, ?
opaque, ?
operators, ?
logical, ?
S
precedence, ? schema
syntax, ? current, ?
or schemas, ?
operator, ? search path, ?
overlay, ? changing at runtime, ?
current, ?
select
P select list, ?
sequences, ?
path (data type), ? and serial type, ?
pg_function_is_visible, ? serial, ?
pg_get_constraintdef, ? serial4, ?
pg_get_indexdef, ? serial8, ?
pg_get_ruledef, ? setting
pg_get_userbyid, ? current, ?
pg_get_viewdef, ? set, ?
pg_opclass_is_visible, ? setval, ?
pg_operator_is_visible, ? set_bit, ?
pg_table_is_visible, ? set_byte, ?
pg_type_is_visible, ? similar to, ?
phantom read, ? sintaxe
23
Index
SQL, ? V
smallint, ?
some, ? variance, ?
version, ?
sorting
void, ?
query results, ?
standard deviation, ?
strings
(Ver character strings) W
subqueries, ?, ?
where, ?
substring, ?, ?, ?
X
T
xid, ?
text
(Ver character strings)
tid, ?
time
constants, ?
current, ?
data type, ?
output format, ?
(Ver Também Formatting)
time with time zone
data type, ?
time without time zone
time, ?
time zones, ?, ?
timestamp
data type, ?
timestamp with time zone
data type, ?
timestamp without time zone
data type, ?
timezone
conversion, ?
trigger, ?
true, ?
types
(Ver data types)
U
union, ?
unqualified names, ?
user
current, ?
24