quarta-feira, 16 de janeiro de 2008

O Comando CREATE DOMAIN...

O comando CREATE DOMAIN permite a criação de domínios de campos que podem ser aplicados a campos das tabelas, restringindo o conjunto de valores aceitos para inclusão e/ou alteração dos dados.

Sintaxe:

CREATE DOMAIN name [ AS ] data_type
[ DEFAULT expression ]
[ constraint [ ... ] ]

onde constraint é:

[ CONSTRAINT constraint_name ]
{ NOT NULL | NULL | CHECK (expression)

Exemplos:

1 - Criação de domínio simples.

CREATE DOMAIN sexo AS char(1);

2 - Domínio com a cláusula DEFAULT. O DEFAULT indica que 'M' será o valor gravado quando o mesmo não for fornecido e em seu lugar a palavra DEFAULT for empregada.

CREATE DOMAIN sexo_default AS char(1)
DEFAULT 'M';

3 - Domínio com a cláusula CHECK restringindo os sexos a masculino e feminino.

CREATE DOMAIN sexo_values AS char(1)
CHECK ( VALUE IN ('M', 'F'));

4 - Domínio com as cláusulas CHECK, NOT NULL e DEFAULT.

CREATE DOMAIN sexo_full AS char(1)
DEFAULT 'M'
NOT NULL
CHECK ( VALUE IN ('M', 'F'));

5 - Domínio em um campo inteiro.

CREATE DOMAIN idade AS integer
DEFAULT 0
NOT NULL
CHECK ( VALUE > 0);

6 - Domínio em um campo tipo data.

CREATE DOMAIN nascimento AS date
DEFAULT '01/01/1900'
NOT NULL
CHECK ( VALUE > '01/01/1900');

7 - Domínio com uma constraint explicitamente nomeada.

CREATE DOMAIN data_evento AS date
CONSTRAINT valida_data CHECK ( VALUE > '01/01/1900' AND VALUE > '01/01/2099');

8 - Utilização de domínios na criação de uma tabela.

CREATE TABLE pessoa_teste(
cod serial,
nasc nascimento,
idade idade,
sexo sexo_full);

INSERT INTO pessoa_teste (nasc ,idade ,sexo) VALUES ('01/01/2007', 12, 'M');

6 comentários:

Anônimo disse...

Boa Tarde. Eu sou um estudante da Faculdade de Engenharia da Univeridade do Porto, em Portugal e gostava de saber como fazes para criar domínios em PostGre do género:
"CHECK ( (TIPO IN ('RTS','FPS','AA','RP','VLG','MM','R','OSG','AG','OS') )" entendeste o meu problema? podes responder para seguranca.feup@gmail.com ? Abraço, Luís Matias

cbleopoldino disse...

Desculpe a demora, Luis.

Segue a solução que encontrei. Espero que sirva!

CREATE DOMAIN sexo_full AS VARCHAR(10)
CHECK ( VALUE IN
('RTS','FPS','AA','RP','VLG','MM','R','OSG','AG','OS'));

Testei no PostgreSQL 8.3


Até mais,

Cláudio

Eduardo Frazão disse...

Para este tipo de restrição simples ( Limitar os dados que podem entrar na coluna, como SP, MG, SC ) e etcs, no postgresql 8.3 foi finalmente disponibilizado o uso dos tipos ENUM. Estes são mais indicados para este tipo de limitação...

Basta criar desta forma:

CREATE TYPE estados AS ENUM('SP','MG','AL');

CREATE TABLE endereco ( estado estados );

Isso vai restringir a entrada de dados, e os dados podem seguramente ser ligados via FK, uso de indices e etcs...

Os domínios devem ser usado para fins mais elaborados, como testar resultado de funções por exemplo. Algo do tipo você ter uma função de validação de CPF, e testar o retorno da função de validação antes do dado entrar na coluna!

Espero ter ajudado!

Um abraço!

Andreza Telles disse...

Olá, estou cursando Sistemas de Informação, e esse semestre estou cursando Banco de Dados Aplicado, o qual utilizo PostgresSQL, no entanto minha dúvida é como faço para criar um campo, onde seu valor será automático 10% o valor de outro campo da tabela.
exemplo: tenho que criar na tabela Consulta um campo taxa_convenio, onde deve ser preenchido com o valor do campo: valor_consulta - valor_consulta*1,14%. Podes me ajudar? Tenho que criar um domínio? Como se faz, preciso de exemplos???
Obrigado.

Cláudio Leopoldino disse...

Andrezza, creio que o uso de uma trigger que atualize o valor a cada alteração/ inserção poderia fazer o preenchimento do campo que você deseja.

Cláudio Leopoldino disse...

Outra possibilidade é criar umja visão ou tabela materializada, utilizando a consulta que você deseja utilizar para preencher o campo.