Clipper On Line • Ver Tópico - Relacionamentos em MySql
Página 1 de 2

Relacionamentos em MySql

MensagemEnviado: 01 Ago 2014 18:49
por Marcos
Gostaria de saber como fazer relacionamentos entre tabelas em MySql e HMG, digamos que tenho na Tabela de Clientes um campo Chamado Código da Filial, neste campo está gravado o código da filial que o cliente compra, neste caso seria um relacionamento de um para muitas, ou seja, um cliente poderia comprar em várias filiais, em outra hipótese, tenho uma tabela de cidades, e na tabela de clientes guardo o código da cidade do cliente, se os campos estiverem relacionados o BD não permitirá a exclusão da Cidade se esta gravada na tabela de clientes. Em DBF isto era feito no braço, já que o MySql o próprio nome diz (SGBD-Sistema Gerencial de Banco de Dados Relacional) gostaria que alguém me ajudasse com um exemplo. Também deve existir ferramentas para fazer estes relacionamentos e jogar apenas os códigos no HeidiSql. Aguardo a experiência dos nobres Colegas.

Relacionamentos em MySql

MensagemEnviado: 01 Ago 2014 21:21
por alxsts
Olá!

Estes relacionamentos são definidos no projeto lógico do banco de dados, onde são definidas todas as tabelas, suas chaves primárias (primary keys), chaves estrangeiras (foreign keys), índices, defaults, check constraints e outras coisas além das colunas. A este conjunto de relacionamentos dá-se o nome de integridade referencial

Encontrei um tutorial na internet, específico para MySQL e creio que poderá nos ajudar. Veja: How to Use MySQL Foreign Keys for Quicker Database Development

Relacionamentos em MySql

MensagemEnviado: 04 Ago 2014 08:33
por Marcos
Alguém poderia nos disponibilizar exemplos, pensei nesta possibilidade porque do que adiantaria usa SGBDR sem explorar seus recursos, isto seria o mesmo que usar DBF.

Relacionamentos em MySql

MensagemEnviado: 04 Ago 2014 10:42
por alxsts
Olá!

Os links que postei acima não servem como exemplos?

Relacionamentos em MySql

MensagemEnviado: 04 Ago 2014 11:08
por Marcos
Estive olhando, mas não entendo nada em Inglês, e se alguém tivesse um Exemplo pronto em Harbour com Mysql seria interessante disponibilizar para o Grupo, também precisamos de uma Ferramenta Case para fazer o relacionamento e gerar o código para o MySql. Alguém se habilita ?

Relacionamento entre tabelas no banco

MensagemEnviado: 14 Dez 2014 14:18
por 09466261000176
Caro amigo quem sabe não ensina parece que aqui isso é regra. Eu não sei,mas acho que deve haver alguma coisa tipo SET RELATION. As pessoas aqui deveriam aprender a descomplicar e passar as coisas, afinal compartilhar conhecimentos seria o objetivo proposto neste forum.

Relacionamentos em MySql

MensagemEnviado: 14 Dez 2014 23:52
por Jairo Maia
09466261000176 escreveu:Caro amigo quem sabe não ensina parece que aqui isso é regra.
Negativo! Rechaço com veemência sua afirmação! Se não fossem os compartilhamentos de informações de conhecimentos dos participantes deste fórum, não tenho dúvidas que hoje eu não seria mais um desenvolvedor. Pois sair do Clipper e hoje poder programar em Harbour usando todos os recursos disponíveis, não seria possível de minha parte sem a ajuda deste fórum. Portanto, se alguma coisa não foi resolvida para você em determinada situação, nem de longe está relacionado ao fato de que os participantes deste fórum RETEEM ou se NEGAM a compartilhar informações.

Relacionamentos em MySql

MensagemEnviado: 15 Dez 2014 16:29
por Ivone Lopes da Silva
Eu também aprendi e resolvi muita coisa através deste forum.

Relacionamentos em MySql

MensagemEnviado: 15 Dez 2014 18:05
por rochinha
Amiguinhos,

compartilhar conhecimentos seria o objetivo proposto neste forum
.

O intuito do forum sempre foi este. O Toledo é que não imaginava a proporção que isto tomaria ao longo destes 15 anos. Muitos dos forenses aqui cadastrados já se foram para o eterno e os que continuam e os que virão darão andamento a todo o conhecimento angariado e postado aqui.

Como disse o caro colega Jairo Maia, talvez e até tenho certeza que você não teve uma resposta aqui no forum e eu sei disso porque ainda tenho pendentes pedidos de colegas de alguma ajuda e que não pude suprir pela falta de tempo.

Mas todas as valorosas contribuição dadas aqui, estão a um clique de serem encontradas.

Na pressa de resolver, é preferível solicitar a velha nova informação ao invés de fazer uma busca refinada pelo motor de pesquisa.

Eu mesmo, muitas vezes faço este tipo de busca aqui dentro, para relembrar, já que a memória não ajuda sozinha.

Talvez, se alguém ficou sem resposta, foi pela falta de tempo e não por desprezo.

Afinal, ninguém se cadastrou no forum esperando lucrar mensalmente com consultoria.

A ajuda que nosso amigo necessita é de cunho avançado e muitos que estão usando motores RDD para SQL estão usando o básico-do-básico para suprir seus clientes e conhecer estes motores.

Com certeza o amigo Marcos, obterá um feedback, assim como você também quando precisar.

Mas, a seu tempo...

Relacionamentos em MySql

MensagemEnviado: 15 Dez 2014 21:38
por rochinha
Amiguinhos,

Eis uma velha ferramenta, que pode servir para entender estes relacionamentos.

MS Query

Infelizmente ferramentas CASE para este intuíto eu nunca cheguei a usar. Talvez estas te auxiliem neste aprendizado.

Database Architect
DB Visual Architect
MySQL Workbench
SQLite3 Database Manager

Lembro de ter feito relacionamentos pelo Access pois ele tem embutida esta característica. Com certeza a melhor ferramenta já se encontra em seu MS Office.

Não são muitas destas boas ferramentas que estão em português e muitas vezes, uma ótima ferramenta, free, pode além de Inglês estar em Espanhol ou até Russo. Então, arriscar nestas linguas é o minimo para nós uma necessidade nata.

Relacionamentos em MySql

MensagemEnviado: 16 Dez 2014 02:25
por rochinha
Amiguinhos,

Para ilustrar o uso de relacionamentos em uma ferramenta vejam a imagem encontra-se anexa.

Exemplo do comando SQL da relação, obtido através do botão SQL existente na interface:
SELECT pn.IDPEDIDO, clientes.IDCLIENTE, condicao.CONDICAO, pn.DATAPED, pn.NFE, pn.VALOR, pn.ICMS, pn.IPI, pn.IDNATUREZA
FROM `c:\5volution\gestao`\clientes.dbf clientes, `c:\5volution\gestao`\condicao.dbf condicao, `c:\5volution\gestao`\es.dbf es, `c:\5volution\gestao`\pn.dbf pn, `c:\5volution\gestao`\transp.dbf transp, `c:\5volution\gestao`\vendedor.dbf vendedor
WHERE pn.IDTRANSP = transp.IDTRANSP AND pn.IDFUNC = vendedor.IDFUNC AND pn.IDCLIENTE = clientes.IDCLIENTE AND pn.IDPEDIDO = es.IDPEDIDO AND pn.IDCONDICAO = condicao.IDCONDICAO


O único pecado de usar MSQuery com .DBF é que arquivos .FPT não são reconhecidos a não ser que o driver ODBC para FoxPRO esteja instalado.

Relacionamentos em MySql

MensagemEnviado: 16 Dez 2014 10:33
por alxsts
Olá!

Muito infeliz o comentário do colega, apesar de não me atingir. Creio que se aquilo fosse verdadeiro, seria a negação da existência deste fórum, que tem sido tão útil ao longo dos últimos 15 anos...

Os links que postei respondem a pergunta feita e servem como ponto de partida para . Ninguém é obrigado a saber inglês, embora seja muito importante em nossa área de atuação. Mas, se houvesse interesse, pelo menos uma tradução do Google ajudaria...

Quanto a desenvolver uma ferramenta case para criar as referências entre tabelas e mostrar o código de criação, seria reinventar a roda. O Heidi SQL tem esta funcionalidade. Basta apenas ter interesse e aprender a manusear a ferramenta. O problema é que alguns não se dispõem a isto. Querem apenas que alguém faça o serviço por eles próprios e lhes entregue tudo pronto.

Relacionamentos em MySql

MensagemEnviado: 19 Dez 2014 00:48
por Itamar M. Lins Jr.
Rapaz tem tantos livros ai, ensinando essas coisas, a internet está lotada de exemplos.
SQL ISO não é apenas p/ MYSQL é para todos os SGBD que adotam a sintaxe.
Não é pago não são livros gratuitos.
Logo de cara, só na wikipedia tem algumas coisas importantes.
http://pt.wikipedia.org/wiki/SQL
A parte do harbour é só perguntar que quem souber a resposta irá responder.

Capitão Picard, não merece ser usado com um comentário desses!

Saudações,
Itamar M. Lins Jr.

Relacionamentos em MySql

MensagemEnviado: 24 Dez 2014 16:25
por dbsh
Um pequeno exemplo de relacionamento entre tabelas MySQL, nao deixando excluir registro na tabela unidade, se já tiver movimento na tabela produto.

CREATE TABLE `unidade` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `DESCRICAO` varchar(250) DEFAULT NULL,
  `FRACIONAR` char(1) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

CREATE TABLE `produto` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `UNIDADE_PRODUTO` int(10) unsigned NOT NULL,
  `CODIGO` varchar(20) DEFAULT NULL,
  `DESCRICAO` varchar(250) DEFAULT NULL,
  `VALOR_VENDA` decimal(18,6) DEFAULT NULL,
  `QTD_ESTOQUE` decimal(18,6) DEFAULT NULL,
  `NCM` varchar(9) DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `FK_UNIDADE_PRODUTO` (`UNIDADE_PRODUTO`),
  CONSTRAINT `produto_ibfk_1` FOREIGN KEY (`UNIDADE_PRODUTO`) REFERENCES `unidade` (`ID`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

Relacionamentos em MySql

MensagemEnviado: 09 Abr 2015 15:01
por rubens
Rapaz... tava pesquisando sobre banco e caí nesta página...
Eu fico super indignado com um post destes...
Nunca, nunca deixei de receber uma ajuda ou qualquer informação neste fórum, seja de simples usuário aos moderadores.
Quantas vezes postei uma dúvida que foi respondida mais de uma vez até.
Fica aqui minha indignação com o colega e meus agradecimentos a todos os outros membros que participam do fórum ajudando uns aos outros.
Parabéns ao Toledo e ao restante dos membros...

Rubens

Relacionamentos em MySql

MensagemEnviado: 12 Nov 2018 16:02
por Marcos
Como poderei criar o relacionamento entre tabelas direto via código (PRG), pois no inicio do sistema tenho uma função que cria as tabelas e o banco de dados, porém não estou conseguindo inserir o código para a criação de Chaves-Estrangeiras, segue o código que tenho:

* cidades
if ascan(aTabelasExistentes,lower('cidades')) != 0
else
  cQuery := 'CREATE TABLE cidades (id INT UNSIGNED NOT NULL AUTO_INCREMENT,'+;
   'codigo INT,'+;
   'municipio VARCHAR(50),'+;
   'uf CHAR(2),'+;   
  'data_cad date,'+;
  'hora_cad char(08),'+;
  'PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8'
  oQuery := oServer:Query(cQuery)
  if oServer:NetErr()
        msginfo('Erro criando tabela : cidades : '+oServer:Error(),'Atenção')
        form_main.release
   endif
   oQuery:Destroy()
endif
* empresas
if ascan(aTabelasExistentes,lower('empresas')) != 0
else
  cQuery := 'CREATE TABLE empresas (id INT UNSIGNED NOT NULL AUTO_INCREMENT,'+;
   'NOME VARCHAR(50),'+;
   'CGC CHAR(18),'+;
   'FANTASIA VARCHAR(50),'+;
   'TELEFONE CHAR(11),'+;
   'ID_CIDADE INT,'+;
  'data_cad date,'+;
  'hora_cad char(08),'+;
  'PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8'
  oQuery := oServer:Query(cQuery)
  if oServer:NetErr()
        msginfo('Erro criando tabela : empresas : '+oServer:Error(),'Atenção')
        form_main.release
   endif
   oQuery:Destroy()
endif

Na tabela de Empresas tem o 'ID_CIDADE' que deverá se relacionar com 'ID' da tabela de Cidades. O código acima está funcionando, porém somente cria as tabelas, não tem relacionamento algum, alguém pode me ajudar?

Relacionamentos em MySql

MensagemEnviado: 12 Nov 2018 17:19
por susviela@bol.com.br
.

O comando que faz isso é o ALTER TABLE

https://mariadb.com/kb/en/library/alter-table/

Por exemplo:

ALTER TABLE produto ADD CONSTRAINT fk_idfornecedor FOREIGN KEY (idfornecedor)
REFERENCES fornecedor (idfornecedor)

Só colocar esse texto em uma string e executar a query se não der erro seu relacionamento está criado.

------

Aqui nesse link está melhor ainda:

https://mariadb.com/kb/en/library/constraint/

Relacionamentos em MySql

MensagemEnviado: 12 Nov 2018 17:39
por susviela@bol.com.br
Você vai precisar ter um certo cuidado com esse item:

[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]


reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION

Inicialmente se vc não manja de "integridade referencial" pode usar:

ON DELETE NO ACTION
ON UPDATE NO ACTION

Mas essa não é a melhor opção

Relacionamentos em MySql

MensagemEnviado: 12 Nov 2018 18:05
por Marcos
Susviela, preciso somente adicionar as linhas de relacionamento entre a tabela Empresas e a Tabela Cidades no exemplo que citei.

Relacionamentos em MySql

MensagemEnviado: 12 Nov 2018 18:53
por susviela@bol.com.br
.

Mais ou menos isso ...


  cQuery := ' ALTER TABLE empresas ADD CONSTRAINT fk_idcidade FOREIGN KEY (idcidade)
    REFERENCES cidades (id)  '
  oQuery := oServer:Query(cQuery)
  if oServer:NetErr()
        msginfo('Erro criando relacionamento  : '+oServer:Error(),'Atenção')
        form_main.release
   endif
   oQuery:Destroy()



O melhor e você entender como isso funciona

Relacionamentos em MySql

MensagemEnviado: 13 Nov 2018 07:22
por Marcos
Bom dia Susviela, problema resolvido obrigado pela paciência e sabedoria.

Relacionamentos em MySql

MensagemEnviado: 13 Nov 2018 08:07
por Marcos
Susviela, para o relacionamento dar certo os campos de Cidades (id) e Empresas (id_cidades) devem estar como KEY, como criar as tabelas já com os campos KEY marcado ?

Relacionamentos em MySql

MensagemEnviado: 13 Nov 2018 10:33
por susviela@bol.com.br
Marcos escreveu:Susviela, para o relacionamento dar certo os campos de Cidades (id) e Empresas (id_cidades) devem estar como KEY, como criar as tabelas já com os campos KEY marcado ?


Então se liga em uma coisa ... o ; (ponto e virgula terminam uma linha em SQL ) o que impede de você colocar mais de comando na linha no seu string ?

cSql := "create table teste .... ;           " +;
            "ALTE TABLE teste .... ;        " +;
            "INSERT INTO teste  .... ;    "

e executar a Query ...

Obs: "o que impede..." na verdade se der um erro no SQL vai um pouco mais difícil de encontrar, só isso.

Tá mas... e se eu criar um arquivo texto com todos os comando e executar esses comando de uma só vez, seria uma ótima ideia ? As possibilidades são infinitas ... vai da criatividade do programador.

Mas é isso ai .. vamos subindo a escada aos poucos, degrau por degrau....

Relacionamentos em MySql

MensagemEnviado: 16 Nov 2018 00:30
por dbsh
Exemplo de relacionamento sem mudar a estrutura do banco de dado
Neste exemplo retornara os valores por tipo de pagamento, por impressora, por data

CAMPOS RETORNADOS:
ACUMULADO,IMPRESSORA,TIPO_PGTO,TOTAL,RECEBIDO,TROCO,SANGRIA,SUPRIMENTO, M.*

DETALHANDO:
V.* - VENDA_CABECALHO - Contém o financeiro das vendas e dados do cliente
M.* - MOVIMENTO - Contém Identificação dos fechamento, pode ser feito mais de um fechamento por dia
TP.* - TOTAL_TIPO_PGTO - Contém as formas de pagamento "parcelas", de cada Cupom Fiscal
P.* - TIPO_PAGAMENTO - Tabela com as formas de pagamento

Poderia colocar Sangria e Suprimento como LEFT JOIN, para efeito didático quis demonstrar como criar uma coluna com outro SELECT
M.* Retorna todos campos da tabela Movimento
Coalesce - Evita que retorne campo NULL
LEFT JOIN - Cria relacionamento e os campos que não tiver valores relacionado na tabela, retorna NULL, retorna toda tabela de acordo com o filtro na clausula WHERE, evitando que a linha toda, "REGISTRO" seja omitida, caso se use INNER JOIN

select v.DATA_VENDA AS ACUMULADO,m.ID_IMPRESSORA,p.DESCRICAO AS TIPO_PGTO,
COALESCE(sum(tp.VALOR), 0) - COALESCE(sum(v.troco),0) AS TOTAL,
COALESCE(sum(v.valor_recebido),0) AS RECEBIDO,
COALESCE(sum(v.troco),0) AS TROCO,
(select sum(valor) from sangria sg where m.id=sg.id_movimento AND sg.id_impressora=m.id_impressora AND sg.id_tipo_pagamento=p.id) as sangria,
(select sum(valor) from suprimento sp where m.id=sp.id_movimento  AND sp.id_impressora=m.id_impressora AND sg.id_tipo_pagamento=p.id) as suprimento,
m.*
from venda_cabecalho v
LEFT JOIN movimento m ON (v.ID_MOVIMENTO = m.ID)
LEFT JOIN total_tipo_pgto tp ON (v.ID = tp.ID_VENDA_CABECALHO)
LEFT JOIN tipo_pagamento p ON (tp.ID_TIPO_PAGAMENTO = p.ID)
WHERE V.STATUS_VENDA <> 'C' AND v.DATA_VENDA BETWEEN '2018-11-01' AND '2018-11-31'
GROUP BY v.DATA_VENDA,m.ID_IMPRESSORA,p.id
ORDER BY v.DATA_VENDA,m.ID_IMPRESSORA,p.descricao

Relacionamentos em MySql

MensagemEnviado: 16 Nov 2018 08:50
por susviela@bol.com.br
dbsh escreveu:Exemplo de relacionamento sem mudar a estrutura do banco de dado


Muito boa dica, essa é uma opção temporária usando sub select, obtendo o resultado, mas o questionamento do colega me pareceu que tinha por objetivo um relacionamento permanente, inclusive com recursos de integridade referencial pois ele comentou acima "qual a vantagem de usar banco de dados então ...".

Ai está pelo menos duas vantagens (relacionamento permanente e a sua contribuição relacionamento temporário ) ente outras "centenas" de vantagens que ele vai acabar descobrindo com o uso de SGBDs.