none
Relacionamento - SQL RRS feed

  • 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.


    terça-feira, 11 de novembro de 2014 18:25

Respostas

  • Deleted
    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 !!!


    terça-feira, 11 de novembro de 2014 19:27

Todas as Respostas

  • talvez

    IDREMETENTE INT REFERENCES CLIENTES(IDCLIENTE) ???

    Ele puxará a referencia porém so se estiver como PK.

    terça-feira, 11 de novembro de 2014 19:14
  • Consegue um exemplo de como utilizar ?
    terça-feira, 11 de novembro de 2014 19: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 !!!


    terça-feira, 11 de novembro de 2014 19:27
  • 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

    terça-feira, 11 de novembro de 2014 19:37
  • Deleted
    terça-feira, 11 de novembro de 2014 20:19
  • Ainda está com o problema ou ja resolveu ??

    quarta-feira, 12 de novembro de 2014 17:55
  • 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.
    sexta-feira, 14 de novembro de 2014 12:36
  • Bom dia Lucas,

    Estou ouvindo alternativas, rs

    Ainda estou pensando em utilizar trigger.

    sexta-feira, 14 de novembro de 2014 12:37