Translate

quinta-feira, 27 de fevereiro de 2014

Postgresql - Criar tabela segunda parte

Nesta segunda parte, vamos mostrar: 
  • como criar uma tabela. Vamos apresentar um exemplo da criação da tabela "tb_paciente";
  • incluir registros em uma tabela utilizando o comando INSERT
  • criar uma coluna com preenchimento obrigatório ou com preenchimento opcional;
  • como exibir os registros de uma tabela utilizando o comando SELECT;
  • nomenclatura de tabela e coluna: descreve as regras para criar um nome de uma tabela e de uma coluna;
Caso tenha interesse, faça o download do exemplo ou veja no GitHub.
Veja a tabela "tb_paciente" exibida na imagem abaixo:


Para criar uma tabela utilizamos o comando CREATE TABLE, veja a sintaxe do comando abaixo:

SINTAXE BÁSICA

CREATE TABLE nome_da_tabela
(
    nome_da_coluna tipo_de_dado,
    nome_da_coluna tipo_de_dado,
    ...
    nome_da_coluna tipo_de_dado
);

Agora que já conhecemos a sintaxe básica vamos criar a tabela "tb_paciente".

CREATE TABLE tb_paciente
(
    prontuario integer,
    nome character varying(255),
    data_nasc date,
    sexo character(1),
    peso numeric(6,3),
    proc_cirurgico boolean
);

Criamos a tabela "tb_paciente", agora vamos incluir os registros nesta tabela através do comando INSERT, veja a sintaxe do comando INSERT a seguir:

INSERT INTO nome_da_tabela
(
    nome_da_coluna_x ,
    nome_da_coluna_y ,
    ...
    nome_da_coluna_z
)
VALUES

(
    valor_da_coluna_x ,
    valor_da_coluna_y ,
    ...
    valor_da_coluna_z
);

No comando INSERT a ordem das colunas e dos valores devem ser iguais. Se no comando incluirmos as colunas x, y e z, dentro do VALUES devemos colocar os valores das colunas x, y e z.
Agora que já conhecemos a sintaxe básica vamos incluir os registros na tabela "tb_paciente".
Segue a inclusão do primeiro registro:

INSERT INTO tb_paciente
(
    prontuario ,
    nome ,
    data_nasc ,
    sexo ,
    peso ,
    proc_cirurgico
)
VALUES

(
    1 ,
    'Maria Santos' ,
    '1984-04-20' ,
    'f' ,
    52.440 ,
    TRUE
);

Observações
  • Valores armazenados em colunas do tipo character varying, character ou text, como nome e sexo devem ser inseridos entre aspas;
  • Uma data inserida no formato aaaa-mm-dd deve estar entre aspas, se não colocarmos as aspas o postgresql interpretará o hífen como sinal de menos e retornará o resultado de uma subtração de números inteiros e haverá um erro. Se não utilizássemos aspas na primeira inclusão em vez de inserir a data 1984-04-20 seria interpretado que estavamos tentando inserir um número inteiro 1960 e haveria um erro:

    ERRO: coluna "data_nasc" é do tipo date mas expressão é do tipo integer


Se a data fosse passada através de uma função, por exemplo, CURRENT_DATE, não seriam utilizadas aspas. A função CURRENT_DATE retorna a data atual.

Segue a inclusão do segundo registro:

INSERT INTO tb_paciente
( prontuario , nome ,  data_nasc ,  sexo ,  peso ,  proc_cirurgico )
VALUES

( 2 ,  'João Silva' ,  '1974-08-29' ,  'm' ,  80.520 ,   FALSE );

Segue a inclusão do terceiro registro:

INSERT INTO tb_paciente
( prontuario ,  nome ,  data_nasc ,  sexo ,  peso ,  proc_cirurgico )
VALUES

( 3 ,  'Ana Moraes' ,  '1982-10-30' ,  'f' ,  57.700 ,  TRUE );

Criar tabela com coluna do tipo serial 

O números dos prontuários estão sendo inseridos sequencialmente um a um e de forma manual, ou seja, o primeiro prontuário cadastrado tem o valor 1, o segundo prontuário cadastrado tem o valor 2 e assim por diante. Para inserirmos automaticamente o número podemos utilizar o tipo de dado serial na coluna "prontuario".
Vamos excluir a tabela "tb_paciente" e vamos criá-la novamente com a coluna "prontuario" do tipo serial.
Para excluir uma tabela utilizamos o comando DROP TABLE, veja a sintaxe deste comando a seguir:
DROP TABLE nome_da_tabela;

Logo para excluir a tabela "tb_paciente", vamos executar o comando abaixo:

DROP TABLE tb_paciente;

Agora que já excluímos a tabela "tb_paciente", vamos recriá-la com o tipo serial:

CREATE TABLE tb_paciente
(
    prontuario serial,
    nome character varying(255),
    data_nasc date,
    sexo character(1),
    peso numeric(6,3),
    proc_cirurgico boolean
);

Criamos a tabela "tb_paciente", com a coluna "prontuario" do tipo serial. Agora não vamos precisar incluir o número do prontuário manualmente (1, 2, 3, 4 ...), a inclusão será feita automaticamente. No lugar dos números incluíremos o valor DEFAULT (valor padrão).

Segue a inclusão do primeiro registro:

INSERT INTO tb_paciente
(
    prontuario ,
    nome ,
    data_nasc ,
    sexo ,
    peso ,
    proc_cirurgico
)
VALUES

(
    DEFAULT ,
    'Maria Santos' ,
    '1984-04-20' ,
    'f' ,
    52.440 ,
    TRUE
);

Segue a inclusão do segundo registro:

INSERT INTO tb_paciente
( prontuario ,  nome ,  data_nasc ,  sexo ,  peso ,  proc_cirurgico )
VALUES

( DEFAULT ,  'João Silva' ,  '1974-08-29' ,  'm' ,  80.520 ,   FALSE );

Mesmo se não declararmos uma coluna do tipo serial e o seu respectivo valor no comando INSERT, a seqüência será preenchida automaticamente da mesma forma.
Neste caso, não vamos incluir a coluna "prontuario" e seu respectivo valor e a sequéncia continuará sendo preenchida automaticamente. Veja o exemplo abaixo:

Segue a inclusão do terceiro registro:

INSERT INTO tb_paciente
(
    nome ,
    data_nasc ,
    sexo ,
    peso ,
    proc_cirurgico
)
VALUES

(
    'Patricia Duarte' ,
    '1990-11-05' ,
    'f' ,
    72.440 ,
    TRUE
);
Comando Insert somente com valores 

Também é possível executar o comando INSERT fornecendo somente os valores sem fornecer as colunas.
O primeiro valor será inserido na primeira coluna, o segundo valor será inserido na segunda coluna e assim por diante.
Veja o exemplo abaixo:

Segue a inclusão do quarto registro:

INSERT INTO tb_paciente
VALUES
(
    DEFAULT ,
    'Bruno Pereira' ,
    '1980-06-23' ,
    'f' ,
    110.440 ,
    TRUE
);

Apesar de o PostgreSql permitir que seja fornecido somente os valores é preciso tomar cuidado para não inverter a ordem dos valores para não ocasionar a inclusão de dados incorretos ou um possível erro de inclusão.
É uma boa prática informar as colunas e os valores.


Criar colunas com preenchimento obrigatório ou opcional

Para determinar se o preenchimento de uma coluna de uma tabela é obrigatório ou opcional devemos utilizar os comandos abaixo:
  • NOT NULL: uma coluna acompanhada com NOT NULL tem preenchimento obrigatório;
  • NULL: uma coluna acompanhada com NULL tem preenchimento opcional;

Exemplo

Vamos criar a tabela "tb_paciente", mas agora especificando quais são as colunas obrigatórias e quais são opcionais.
  • colunas de preenchimento obrigatório: "prontuario", "nome", "data_nasc", "sexo" e "proc_cirurgico";
  • colunas de preenchimento opcional: "peso";

Antes de criá-la com esta nova opção, vamos excluir a tabela "tb_paciente" que criamos anteriormente, executando o comando a seguir:

DROP TABLE tb_paciente;

Agora que já excluímos a tabela "tb_paciente", vamos recriá-la indicando quais as colunas são obrigatórias e quais são opcionais.
Veja o comando abaixo:

CREATE TABLE tb_paciente
(
    prontuario serial NOT NULL,
    nome character varying(255) NOT NULL,
    data_nasc date NOT NULL,
    sexo character(1) NOT NULL,
    peso numeric(6,3) NULL,
    proc_cirurgico boolean  NOT NULL
);

OBSERVAÇÕES
  • Na coluna "prontuario" foi colocado NOT NULL, para indicar que é obrigatório inserir um valor nesta coluna, porém como ela é do tipo serial, já tem uma restrição não nula, logo não necessário colocar NOT NULL nesta coluna;
  • Na coluna "peso" foi colocado NULL, para indicar que esta coluna opcional, porém se não colocarmos NULL, ela será opcional da mesma forma, pois quando não declararmos nenhum parâmetro de restrição para uma coluna ela será opcional.

A tabela abaixo, será criada com os mesmas restrições da tabela que criamos anteriormente.

CREATE TABLE tb_paciente
(
    prontuario serial,
    nome character varying(255) NOT NULL,
    data_nasc date NOT NULL,
    sexo character(1) NOT NULL,
    peso numeric(6,3),
    proc_cirurgico boolean NOT NULL
);

Quando não incluirmos uma dado em um campo obrigatório haverá um erro. Não vamos inserir uma data no campo "data_nasc" e será exibido um erro. Veja os comandos a seguir:

INSERT INTO tb_paciente (prontuario, nome, sexo, peso, proc_cirurgico )
VALUES (DEFAULT, 'Carlos Pereira', 'm', 57.700, TRUE);

ERRO: valor nulo na coluna "data_nasc" viola a restrição não-nula
SQL state: 23502


INSERT INTO tb_paciente (prontuario, nome, data_nasc, sexo, peso, proc_cirurgico)
VALUES (DEFAULT, 'Paulo Soares', NULL, 'm', 85.400, TRUE);

ERRO: valor nulo na coluna "data_nasc" viola a restrição não-nula
SQL state: 23502


Quando não incluirmos um dado em um campo opcional não haverá problema. Exemplo: campo peso.

INSERT INTO tb_paciente (prontuario, nome, data_nasc, sexo, proc_cirurgico)VALUES (DEFAULT, 'Rosana Alves', '1979-04-13', 'f', TRUE);

INSERT INTO tb_paciente (prontuario, nome, data_nasc, sexo, peso, proc_cirurgico)VALUES (DEFAULT, 'Rafael Brito', '1979-05-14', 'f', NULL, TRUE);


Inserir mais de um registro com o comando INSERT
SINTAXE

INSERT INTO nome_da_tabela
( nome_da_coluna_x ,   nome_da_coluna_y ,  ...  nome_da_coluna_z )
VALUES

( valor_da_coluna_x ,  valor_da_coluna_y , ...  valor_da_coluna_z ) ,
( valor_da_coluna_x ,  valor_da_coluna_y , ...  valor_da_coluna_z ) ,
( valor_da_coluna_x ,  valor_da_coluna_y , ...  valor_da_coluna_z ) ;

EXEMPLO

No exemplo a seguir, inserimos 3 registros.

INSERT INTO tb_paciente
( prontuario ,   nome ,  data_nasc ,  sexo ,  peso ,  proc_cirurgico )
VALUES

( DEFAULT , 'Daniel Alves' ,  '1992-12-06' ,  'm' ,  100.520 ,  FALSE ) ,
( DEFAULT , 'Priscila Monteiro' ,  '1982-10-30' ,  'f' ,  64.280 ,  TRUE ) ,
( DEFAULT , 'Otaviano Costa' ,  '1976-03-18' ,  'm' ,  144.520 ,  FALSE ) ;

Exibir registros de uma tabela

Para exibir os registros de uma tabela utilizamos o comando SELECT.

SELECT
    nome_da_coluna,
    nome_da_coluna,
    ...
    nome_da_coluna
FROM nome_da_tabela;

Exemplo
Exibir os registros das tabela tb_paciente.

SELECT
    prontuario,
    nome,
    data_nasc,
    sexo,
    peso,
    proc_cirurgico
FROM tb_paciente;

Veja os resultados deste comando na imagem abaixo:



Em vez de declarar todas as colunas da tabela, utilize o símbolo de "*" para facilitar.

SELECT * FROM tb_paciente;

Veja os resultados deste comando na imagem abaixo:



Não precisamos selecionar todas as colunas, podemos escolher quais precisamos.

SELECT
    nome,
    data_nasc
FROM tb_paciente;

Veja os resultados deste comando na imagem abaixo:


Nomenclatura das tabelas e colunas

Os nomes das tabelas e colunas devem iniciar com letras ou underscore "_".

Os nomes das tabelas e colunas serão gravados em caracteres minúsculos mesmo que você tenha criado em caracteres maiúculo.

Exemplo

CREATE TABLE Tb_nomenclatura
(
    COLUNA_1 integer,
    Coluna_2 character varying(30)
);

Caso haja necessidade de gravar o nome de uma tabela ou coluna com letras maiúsculas, espaços, acentos, ou iniciada por um número, este nome deve ser gravado entre aspas duplas "". Este tipo de nomenclatura não é recomendável.

Exemplo

CREATE TABLE "Tb nomenclatura 2"
(
    "COLUNA_1" serial,
    "Coluna_2" character varying(30),
    "Coluna 3" char(2),
    "4_Coluna" smallint,
    "endereço" character varying(50)
);

Caso tenha que executar um comando sql, por exemplo, SELECT também será necessário colocar o nome da tabela e das colunas entre aspas duplas "".

SELECT
    "COLUNA_1" ,
    "Coluna_2",
    "Coluna 3",
    "4_Coluna",
    "endereço"
FROM "Tb nomenclatura 2";


Em breve, publicaremos a utilização do comando INSERT com RETURNING

Comente no campo abaixo, suas sugestões e críticas serão bem-vindas.


Leia o artigo:

PostgreSql - Criar tabela primeira parte
PostgreSql - Criar um banco de dados parte I
PostgreSql - Criar um banco de dados parte II
PostgreSql - Criar um banco de dados parte III

Nenhum comentário:

Postar um comentário