Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Relacionamento 1:


Nill

Pergunta

Usando o DBdesigner, fiz 2 tabelas com relacionamento 1:N. O SQL das tabelas ficou dessa forma:

CREATE TABLE tbl_clientes (
  id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  empresa CHAR(155) NULL,
  cnpj CHAR(18) NULL,
  PRIMARY KEY(id)
);

CREATE TABLE tbl_pesqsat (
  id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  cod INTEGER UNSIGNED NOT NULL,
  tbl_clientes_id INTEGER UNSIGNED NOT NULL,
  responsavel CHAR(255) NULL,
  email CHAR(150) NULL,
  data DATE NULL,
 .
 .
 .
  comentario CHAR(255) NULL,
  PRIMARY KEY(id, cod),
  INDEX tbl_pesqsat_FKIndex1(tbl_clientes_id)
);
Eu relacionei a tbl_clientes campo ID com a tbl_pesqsat campo COD. porém na tbl_pessat foi criado o campo tbl_clientes_id INTEGER UNSIGNED NOT NULL,, e quando mando gravar os dados no banco, este campo fica com valor 0. Minha sql de gravação no banco ficou assim.
//inserindo os dados na tbl_pesqsat
   $sql="INSERT INTO tbl_pesqsat (cod,responsavel,email,data,mercado) VALUES ('$cod','$responsavel','$email','$data','$mercado')";

não coloquei todos os campos na sql pois estou testando o porque do campo tbl_clientes_id INTEGER UNSIGNED NOT NULL,, esta em branco.

Alguém sabe o que fiz de errado.

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Oi, Nill!

Já que você está em fase de aprendizado, vamos melhorar um pouco a sua metodologia.

adote como regra que os nomes de atributos(campos) são únicos e devem se referenciar sempre a uma única idéia.

Por exemplo, nas tabelas tbl_clientes e tbl_pesqsat os atributosid que você criou possuem o mesmo nome porém com idéias (semânticas) diferentes já que um guarda o id do cliente e o outro guarda o id do pesqsat. O ideal, neste caso é atribuir um nome que seja único e represente a semântica correta.

Troque os nomes do atributosid na tabela tbl_clientes para id_cliente.

Troque, também, o nome do atributo id na tabela tbl_pesqsat para id_pesqsat. Parece besteira ma isto o ajudará muito quando você trabalhar com bancos que contenham muitas tabelas.

Seguindo a idéia acima, troque o nome do atributo tbl_clientes_id na tabela tbl_pesqsat para id_cliente. Observe que a semantica e o nome do atributo foram preservados. Quando se vê o nome do atributo sabe-se imediatamente do que se trata.

Agora, respondendo sua pergunta. Não há nada errado com seu cadastro. Você provavelmente não criou a integridade referencial que o impediria de cadastrar um id_cliente (já assumi que você trocou o nome dos atributos) na tabela tbl_pesqsat antes de você cadastrá-lo na tabela tbl_clientes. Então o banco aceitou, sem questionar, o que você mandou fazer.

Outro ponto que podemos citar aqui é que quando você informou tbl_clientes_id INTEGER UNSIGNED NOT NULL na criação da tabela tbl_pesqsat você não informou o valor default para este atributo, então o MySQL assumiu que o valor dele será ZERO.

Todas as vezes que você cadastrar algo em tbl_pesqsat e não informar o valor de id_cliente, e não existir a integridade referencial, então id_cliente será preenchido com ZERO.

Link para o comentário
Compartilhar em outros sites

  • 0

Denis;

Fiz as alterações que você me disse, realmente fica bem mais fácil de se identificar o que se referem cada campo.

As alterações ficaram assim.

CREATE TABLE tbl_clientes (
  id_clientes INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  empresa CHAR(155) NULL,
  cnpj CHAR(18) NULL,
  PRIMARY KEY(id_clientes)
);

CREATE TABLE tbl_pesqsat (
  id_pesqsat INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  id_clientes INTEGER UNSIGNED NOT NULL,
  tbl_clientes_id_clientes INTEGER UNSIGNED NOT NULL,
  responsavel CHAR(255) NULL,
  email CHAR(150) NULL,
  data DATE NULL,
  mercado TINYINT(2) UNSIGNED NULL,
  participacao TINYINT(2) UNSIGNED NULL,
.
.
.
  instaimp TINYINT(2) UNSIGNED NULL,
  comentario CHAR(255) NULL,
  PRIMARY KEY(id_pesqsat, id_clientes),
  INDEX tbl_pesqsat_FKIndex1(tbl_clientes_id_clientes)
);

Agora com relação ao cadastramento, estou fazendo assim:

Na tbl_clientes, pego no id_clientes e gravo ele na tbl_pesqsat em id_clientes, ou seja, assim sei que os dados que estão na tbl_pesqsat foram feitas pelo cliente de ID=X.

Com relação ao campo tbl_clientes_id_clientes INTEGER UNSIGNED NOT NULL, que foi criado automática quando fiz o relacionamento. Você disse que não informei o valor default para esse atributo.

O problema e que eu não sei o que é gravado neste campo, já que foi o relacionamento que o criou. Em outra tabela que possuo o relacionamento é de n:m e com isso foi criado outra tabela, e os dados dessa tabela é automaticamente preenchido. Imaginei que este campo seria da mesma forma.

O que deve fazer com este campo para não ficar com o valor 0? Gravar o id_clintes tambémm nele?

Editado por Nill
Link para o comentário
Compartilhar em outros sites

  • 0

Nill,

1. Que tipo de engine você está usando? InnoDB ou MyISAM?

O motivo desta pergunta é que no engine MyISAM não há controle de integridade referencial por parte do banco de dados. Você pode, por exemplo excluir o pedido de vendas, por exemplo sem excluir os ítens do pedido de vendas. Deixando-os órfãos, isto é sem nenhuma referência para poder achá-los novamente. No caso de MyISAM, ainda, o controle de integridade referencial deverá ser feito por você através da linguagem de programação que você usa.

O engine InnoDB, por outro lado, e, se montado corretamente, impedirá que situações como as que mencionei acima ou que a que você está passando, ocorra.

Á vantagem do engine MyISAM sobre o engine InnoDB é a velocidade de acesso.

2.

O que deve fazer com este campo para não ficar com o valor 0? Gravar o id_clintes também nele?

Resposta: SIM. É através deste id_cliente gravado na tabela tbl_pesqsat que você encontrará a referência ao registro contido na tabela tbl_clientes.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...