Você está na página 1de 16

Restrições

Não Permitir Nulo


(not null)
• Permitir nulo é uma restrição simples, onde
definimos se um campo pode ou não ser
deixado sem preencher. Caso seja obrigatório,
teremos mensagem de erro.
CREATE TABLE produtos (
cod_prod integer NOT NULL ,
nome text NOT NULL ,
preco numeric );

insert into produtoy (cod_prod, preco) values (10, 10)


insert into produtoy (cod_prod, nome, preco) values (10, 'teste', 10)
O uso do NULL

CREATE TABLE produtos (


cod_prod integer NULL,
nome text NULL,
preco numeric NULL );
Unique
• Deixar um campo com valor unique significa dizer que
ele não terá dados repetidos.

• Uma chave primária por natureza é unique.


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

CREATE TABLE exemplo (


a integer,
b integer,
c integer,
UNIQUE (a, c) );
Dando nome para uma restrição Unique

CREATE TABLE produtos (


cod_prod integer CONSTRAINT unq_cod_prod UNIQUE,
nome text,
preco numeric );
CHECK
• A função faz a verificação de regras para sua
tabela.

alter table cliente


add constraint ck_cliente
check (UF in ('SP', 'RJ', 'BA', 'DF', 'MG','DF', 'PR'))

CREATE TABLE produtos


( cod_prod integer,
nome text,
preco numeric CHECK (preco > 0) );

CREATE TABLE produtos (


cod_prod integer,
nome text,
preco numeric CONSTRAINT chk_preco_positivo CHECK (preco > 0) );
Check
CREATE TABLE produtos (
cod_prod integer,
nome text,
preco numeric CHECK (preco > 0),
preco_com_desconto numeric,
CHECK (preco_com_desconto > 0),
CHECK (preco > preco_com_desconto) );

Teste:
insert into produtox values (10, 'teste', -5, 10)
insert into produtox values (10, 'teste', 5, 10)
insert into produtox values (10, 'teste', 15, 10)
Exemplo com mais
de uma restrição

CREATE TABLE produtos (


cod_prod integer NOT NULL,
nome text NOT NULL,
preco numeric NOT NULL CHECK (preco > 0) );
Chave primária

CREATE TABLE produtos (


cod_prod integer PRIMARY KEY,
nome text,
preco numeric );

O campo cod_prod não repete, e não pode ser nulo(teoricamente).

Testar se um coluna de chave primária pode ser nula.


Chave estrangeira
• Mantem integridade referencial entre duas tabelas
• CREATE TABLE produtos (
• cod_prod integer PRIMARY KEY,
• nome text,
• preco numeric );

• CREATE TABLE pedidos (


• cod_pedido integer PRIMARY KEY,
• cod_prod integer REFERENCES produtos (cod_prod),
• quantidade integer );

• Só podemos cadastrar pedidos de produtos que


existem no banco de dados
Chave estrangeira
• No exemplo anterior poderíamos ter escrito assim:

• CREATE TABLE pedidos (


• cod_pedido integer PRIMARY KEY,
• cod_prod integer REFERENCES produtos,
• quantidade integer );

• Pois quando informamos a coluna que está


relacionada, obrigatoriamente será relacionada a
chave primária da tabela referenciada.
Chave estrangeira
• CREATE TABLE t1 (
• a integer PRIMARY KEY,
• b integer, c integer,
• FOREIGN KEY (b, c) REFERENCES outra_tabela (c1, c2) );

• Também pode referenciar mais de uma coluna


Verificar uma situação N para N
• CREATE TABLE produtos (
• cod_prod integer PRIMARY KEY,
• nome text,
• preco numeric
• );

• CREATE TABLE pedidos (


• cod_pedido integer PRIMARY KEY,
• endereco_entrega text,

• ); Observar que as colunas são
chaves estrangeiras
E também fazem parte da chave
• CREATE TABLE itens_pedidos ( primária da tabela
• cod_prod integer REFERENCES produtos, Itens_pedidos
• cod_pedido integer REFERENCES pedidos,
• quantidade integer,
• PRIMARY KEY (cod_prod, cod_pedido)
• );
Teste de chaves
• Tentar executar o insert abaixo:
• insert into itens_pedidos values (10,100,10)

• Observar que falta ele ter a quem referenciar em outra tabela conforme criação das tabelas em slide anterior

• insert into produtos values (10, 'caneta', 1)


• insert into produtos values (11, 'Lapis', 0.5)

• insert into pedidos values (100, 'rua xy de novembro')


• insert into pedidos values (101, 'rua 7 de setembro')
• insert into pedidos values (102, 'rua 4 de abril')

• Tentar após os lançamentos


• insert into itens_pedidos values (10,100,10)

• select * from pedidos;


• select * from itens_pedidos;
• select * from produtos
Restrição além de controlar o obrigatoriedade
no relacionamento pode possuir uma clausula
de cascade
• Refaça o banco de dados com a seguinte estrutura

• CREATE TABLE produtos (


• cod_prod integer PRIMARY KEY,
• nome text,
• preco numeric
• );

• CREATE TABLE pedidos (


• cod_pedido integer PRIMARY KEY,
• endereco_entrega text,
• );

• CREATE TABLE itens_pedidos (


• cod_prod integer REFERENCES produtos ,
• cod_pedido integer REFERENCES pedidos ON DELETE CASCADE,
• quantidade integer,
• PRIMARY KEY (cod_prod, cod_pedido)

Testar agora o Cascade
• insert into produtos values (10, 'caneta', 1)
• insert into produtos values (11, 'Lapis', 0.5)

• insert into pedidos values (100, 'rua xy de novembro')


• insert into pedidos values (101, 'rua 7 de setembro')
• insert into pedidos values (102, 'rua 4 de abril')

• insert into itens_pedidos values (10,100,10)


• insert into itens_pedidos values (11,100,5)
• insert into itens_pedidos values (10,101,11)
• insert into itens_pedidos values (11,102,11)

• Verifique os pedidos e intens na tabela


• select * from pedidos
• select * from itens_pedidos
• select * from produtos

• Excluir o pedido 100 e verificar se algo aconteceu na tabela itens_pedidos

• delete from pedidos where cod_pedido = 100


• select * from itens_pedidos
• ** Observar que o pedido 100 foi apagado e item do pedido que se relaciona com pedido, que tem seu
relacionamento com restrição de cascade deixou de ter registros do pedido 100

Você também pode gostar