Usuário com melhor resposta
Relacionamento - SQL

Pergunta
-
Boa tarde pessoal,
Tenho uma tabela CLIENTES com o campo idcliente sendo a chave primária.
Tenho uma segunda tabela, CTE, contendo os campos idremetente, iddestinatario e idresponsavel, onde nesses campos informo o idcliente da tabela CLIENTES.
Acontece que não consegui definir os campos do cliente relacionado na tabela CTE como foreign key pois os três não são obrigatórios.
Qual a melhor opção para garantir que, na exclusão de um CLIENTE, seja verificado se ele está sendo utilizado em algum dos três campos da tabela CTE ?
Pensei em criar uma trigger, mas pelo que li o pessoal fala para evitar, não sei se por causa de performance.
Valeu.
- Editado Jonas C. de Oliveira terça-feira, 11 de novembro de 2014 18:28
Respostas
-
Deleted
- Sugerido como Resposta Ricardo Barbosa Cortes quarta-feira, 12 de novembro de 2014 16:28
- Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 12 de novembro de 2014 17:38
terça-feira, 11 de novembro de 2014 20:19 -
CREATE TABLE CLIENTES(
ID_CLIENTE INT IDENTITY PRIMARY KEY)
CREATE TABLE CTE(
ID_REMETENTE INT REFERENCES CLIENTES(ID_CLIENTE),
ID_DESTINARIO INT REFERENCES CLIENTES(ID_CLIENTE),
ID_RESPONSALVE INT REFERENCES CLIENTES(ID_CLIENTE))
Muito cuidado ao deletar as tabelas, se voce criar a tabela com referencia ao cliente (1) por exemplo, nao podera deletar o cliente (1), tera que deletar todos seus "filhos".
É isso ai !!!
- Sugerido como Resposta Ricardo Barbosa Cortes quarta-feira, 12 de novembro de 2014 16:28
- Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 12 de novembro de 2014 17:38
Todas as Respostas
-
-
-
CREATE TABLE CLIENTES(
ID_CLIENTE INT IDENTITY PRIMARY KEY)
CREATE TABLE CTE(
ID_REMETENTE INT REFERENCES CLIENTES(ID_CLIENTE),
ID_DESTINARIO INT REFERENCES CLIENTES(ID_CLIENTE),
ID_RESPONSALVE INT REFERENCES CLIENTES(ID_CLIENTE))
Muito cuidado ao deletar as tabelas, se voce criar a tabela com referencia ao cliente (1) por exemplo, nao podera deletar o cliente (1), tera que deletar todos seus "filhos".
É isso ai !!!
- Sugerido como Resposta Ricardo Barbosa Cortes quarta-feira, 12 de novembro de 2014 16:28
- Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 12 de novembro de 2014 17:38
-
Lucas, valeu pela força, mas ainda continuo com o mesmo problema.
Os campos da tabela CTE não são obrigatórios.
Pode ocorrer uma inserção do tipo "insert into CTE values(0,0,1)", ou seja, só "relaciona" o cliente no campo ID_responsavel.
Eu deixei sem relacionamento no banco, assim consigo inserir os registros.
O que preciso é na exclusão verificar que, por exemplo, não posso excluir o cliente 1 pois ele está "relacionado" na tabela CTE.
Valeu
-
-
Bom dia José, Não costumo utilizar NULL por alguns conceitos que ouvi, dentre eles o fato de que, num select é feita a pesquisa em todos os registros para aquele campo, mesmo que, por exemplo, o resultado fosse apenas os 10 primeiros de uma tabela com 10.000 registros. Outra questão é que, por exemplo, "select * from CTE where id_destinatario != 2" não retornaria nada, já que o NULL não é considerado. Lógico que tem solução, adicionando "and id_destinatario is not null", mas é um critério a mais de pesquisa. Tem muita discussão, contra e a favor, mas acabei seguindo o caminho de não utilizar. Por isso pensei em utilizar trigger na exclusão do cliente, mas não sei o quanto é legal ou não. Estou sempre aprendendo, então, se tiver uma outra idéia, agradeço. Abraço, valeu.
-