BD I – Restrições de integridade e Tipos de dados do PostgreSQL

Segundo Heuser

  • Objetivo primordial de um SGBD
    • Garantir a integridade de dados.
  • Para garantir a integridade de um banco de dados:
    • SGBDs oferecem mecanismos de especificação de restrições de integridade.
  • Uma restrição de integridade é uma regra de consistência de dados que é garantida pelo próprio SGBD.

Restrições de integridade básicas:

  • Integridade de domínio;
  • Integridade de vazio;
  • Integridade de chave;
  • Integridade referencial.

São garantidas automaticamente por um SGBD relacional através de especificação declarativa e não é exigido que o programador escreva procedimentos para garanti-las explicitamente.

Tipos de dados do PostGreSQL

INTEGER – Dados do tipo inteiro, faixa -2147483648 a +2147483647

NUMERIC(P,E) – Dados do tipo monetário, por exemplo a coluna SALARIO NUMERIC(10,2) guarda um número positivo/negativo até 99999999,99.

DATE – Dados do tipo data

BIGINT – Inteiro de faixa larga, pode ser usado em chaves primárias, faixa -9223372036854775808 a 9223372036854775807

SERIAL – Inteiro de 4 bytes com auto-incremento e é usado em chaves primárias faixa 1 a 2147483647.

BIGSERIAL – Inteiro de 8 bytes com auto-incremento e é usado em chaves primárias faixa de 1 a 9223372036854775807.

VARCHAR(N) – Armazena dados do tipo STRING, por exemplo NOME VARCHAR(100)

CHAR(N) – Armazena dados do tipo STRING mas com tamanho FIXO ou seja sempre tamanho fixo, exemplo: SEXO CHAR(1) vai guardar M ou F, UF CHAR(2) guarda sempre dois bytes tipo ‘RS’,’AL’,’RJ’…

Link da documentação oficial

Integridade de domínio com SQL.

CREATE DOMAIN DSEXO AS CHAR(1)
   NOT NULL
   CHECK ( VALUE IN ('M','F') )
;

CREATE DOMAIN DSALARIO AS NUMERIC (10,2)
  NOT NULL
  CONSTRAINT SALARIO_MINIMO_SOMENTE CHECK (VALUE = 18 AND VALUE <= 99)

Foram criados 3 domínios DSEXO, DSALARIO e DIDADE todos com ‘D’ na frente. agora o código de uso dos mesmos.

CREATE TABLE PESSOA (
 ID SERIAL NOT NULL PRIMARY KEY,
 NOME    VARCHAR(100) NOT NULL,
 SEXO    DSEXO,
 SALARIO DSALARIO,
 IDADE   DIDADE,
 OBSERVACAO VARCHAR(300),
 DEPCODIGO  INTEGER NOT NULL,
 CONSTRAINT PESSOA_DEPTO_FK FOREIGN KEY (DEPCODIGO) REFERENCES DEPTO ON DELETE CASCADE
);

Ao invés de usar os tipos de dados varchar,integer,numeric usamos os domínios. Ao tentar fazer qualquer inserção ou atualização nos dados os domínios não vão deixar inserir valores fora das faixas estabelecidas.

Integridade de vazio com SQL.

Um valor de campo pode assumir o valor especial vazio (ou desconhecido) (“null” em inglês).

Colunas que não podem assumir valores vazios (null) são chamadas de colunas obrigatórias;

exemplo:

CREATE TABLE PESSOA (
  NOME VARCHAR(100) NOT NULL,
  OBSERVACAO VARCHAR(300)
);

No exemplo acima a coluna nome não pode conter vazios mas a coluna observação sim, o insert seria:

INSERT INTO PESSOA(NOME,OBSERVACAO) VALUES ('OLAVO BILAC',NULL);

Ou

INSERT INTO PESSOA(NOME) VALUES ('OLAVO BILAC');

Integridade de chave

Impede que um valor de uma chave se repita, seja única. O código abaixo define esse restrição e também a de domínio da coluna, que não pode assumir nulos (null).

 CREATE TABLE PESSOA (
   ID INTEGER NOT NULL CONSTRAINT PESSOA_PK PRIMARY KEY,
   .
   .
   .
 );

Integridade referencial e cláusula constraint

Uma chave estrangeira de uma relação tem que coincidir com uma chave primária da sua tabela “pai” a que a chave estrangeira se refere. Ou seja, não só deve existir o atributo (campo), como também, o valor referenciado. Pode-se dar nome a restrição usando a cláusula CONSTRAINT.

CREATE TABLE DEPTO (
  DEPCODIGO INTEGER CONSTRAINT DEPTO_PK PRIMARY KEY,
  DEPNOME   VARCHAR(50) NOT NULL
);

CREATE TABLE PESSOA (
 PESCODIGO INTEGER NOT NULL CONSTRAINT PESSOA_PK PRIMARY KEY,
 NOME      VARCHAR(100) NOT NULL,
 SEXO      DSEXO,
 SALARIO   DSALARIO,
 IDADE     DIDADE,
 OBSERVACAO VARCHAR(300),
 DEPCODIGO INTEGER NOT NULL,
 CONSTRAINT PESSOA_DEPTO_FK FOREIGN KEY (DEPCODIGO) REFERENCES DEPTO ON DELETE CASCADE
);  

INSERT INTO DEPTO(DEPCODIGO,DEPNOME) VALUES (10,'TECNOLOGIA DA INFORMAÇÃO');
INSERT INTO DEPTO(DEPCODIGO,DEPNOME) VALUES (20,'RECURSOS HUMANOS');

INSERT INTO PESSOA(PESCODIGO,NOME,SEXO,SALARIO,IDADE,OBSERVACAO,DEPCODIGO)
            VALUES (1,'OLAVO BILAC','M',724,19,NULL,10);

No caso a pessoa Olavo Bilac trabalha no setor de tecnlogia da informação e não podemos eliminar o departamento de código 10, pois tem uma pessoa trabalhando lá, o SGBD levantará um erro pois está violando a integridade referencial,  mas se eu eliminar o departamento 20 não terá problemas pois não trabalha ninguém lá.

Próximo post:

Restrições de integridade básicas – parte 2.

Esse post foi publicado em BD I - Banco de Dados I. Bookmark o link permanente.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s