1
resposta

[Dúvida] SQL - Referenciando tabelas no banco.

Bom dia, minha dúvida é o seguinte, estou criando uma tela em um programa que usa duas tabelas, por exemplo:

CREATE TABLE tb1 
   (    "ID" NUMBER(25) DEFAULT 1 NOT NULL ENABLE,
      CONSTRAINT "tb1_pk" PRIMARY KEY ("ID") ENABLE
   );

CREATE TABLE tb2 
   (    "ID" NUMBER(25) DEFAULT 1 NOT NULL ENABLE, 
    "tb1_ID" NUMBER(25),
     CONSTRAINT "tb2_pk" PRIMARY KEY ("ID") ENABLE, 
     CONSTRAINT "fk_tb1" FOREIGN KEY ("tb1_ID")
      REFERENCES "tb1" ("ID") ENABLE
   );

Os IDs é feito auto increment então a medida q é inserido algo eles sempre vão de 1 pra 2 pra 3 etc...

Como faço para a coluna tb1_ID q é a FK pegar o valor q foi referenciado. No programa são feitos 2 inserts, finalizado os inserts na tb1 já é redirecionado para a segunda tabela onde será feito o insert na tb2.

Sobre a questão nas duas telas não aparecerão para o usuário da tela botar nada de ID ou tb1_ID, claro tem mais campos nas tabelas mas esses são os que importa para essa pergunta, não sei se expliquei direito mas posso dar mais informações se precisar.

1 resposta

Oi Jhonathan! Tudo certo por aí?

Peço desculpas pela demora em te responder.

Para criar estas mesmas tabelas para auto increment, utilize:

CREATE TABLE TB1 (
   ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
   CONSTRAINT tb1_pk PRIMARY KEY (ID)
);

CREATE TABLE TB2 (
   ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
   TB1_ID NUMBER,
   CONSTRAINT tb2_pk PRIMARY KEY (ID),
   CONSTRAINT fk_tb1 FOREIGN KEY (TB1_ID) REFERENCES TB1 (ID)
);

Dito isso, primeiro vamos validar como é incluído um campo na TB1:

INSERT INTO TB1 DEFAULT VALUES;

Antes de deixar tudo em uma linha só, vamos fazer manualmente a inserção na TB2:

INSERT INTO TB2 (TB1_ID) VALUES (1);

Ou seja, ao executar:

SELECT * FROM TB1

Temos a saída:

ID
1

E ao executar:

SELECT * FROM TB2

Temos a saída:

IDTB1_ID
11

Para uma inserção única sem referenciar os IDs, observe o seguinte trecho:

INSERT INTO TB1 DEFAULT VALUES RETURNING ID INTO :tb1_id; 
INSERT INTO TB2 (TB1_ID) VALUES (:tb1_id); 

Perceba que ainda estamos executando dois comandos, entretanto, após executar o primeiro comando, estamos retornando o ID auto-incrementado da TB1 para a variável tb1_id e em seguida, utilizando-a como valor para o insert na TB2.

O código pode ter especificidades diferentes dependendo do SGBD que você está utilizando. Porém, a ideia pode ser adaptada.

Espero ter contribuído!

Abraços.