Relacionamentos em MySql

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
Marcos
Usuário Nível 3
Usuário Nível 3
Mensagens: 355
Registrado em: 20 Set 2003 09:16
Localização: Cáceres/Mato Grosso

Relacionamentos em MySql

Mensagem 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:

Código: Selecionar todos

* 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?
Atenciosamente,
_____________________________
Marcos Antonio da Silva
marcosilva90@hotmail.com
Avatar do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

Relacionamentos em MySql

Mensagem 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/
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

Relacionamentos em MySql

Mensagem 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
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar do usuário
Marcos
Usuário Nível 3
Usuário Nível 3
Mensagens: 355
Registrado em: 20 Set 2003 09:16
Localização: Cáceres/Mato Grosso

Relacionamentos em MySql

Mensagem por Marcos »

Susviela, preciso somente adicionar as linhas de relacionamento entre a tabela Empresas e a Tabela Cidades no exemplo que citei.
Atenciosamente,
_____________________________
Marcos Antonio da Silva
marcosilva90@hotmail.com
Avatar do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

Relacionamentos em MySql

Mensagem por susviela@bol.com.br »

.

Mais ou menos isso ...

Código: Selecionar todos



  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
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar do usuário
Marcos
Usuário Nível 3
Usuário Nível 3
Mensagens: 355
Registrado em: 20 Set 2003 09:16
Localização: Cáceres/Mato Grosso

Relacionamentos em MySql

Mensagem por Marcos »

Bom dia Susviela, problema resolvido obrigado pela paciência e sabedoria.
Atenciosamente,
_____________________________
Marcos Antonio da Silva
marcosilva90@hotmail.com
Avatar do usuário
Marcos
Usuário Nível 3
Usuário Nível 3
Mensagens: 355
Registrado em: 20 Set 2003 09:16
Localização: Cáceres/Mato Grosso

Relacionamentos em MySql

Mensagem 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 ?
Atenciosamente,
_____________________________
Marcos Antonio da Silva
marcosilva90@hotmail.com
Avatar do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

Relacionamentos em MySql

Mensagem 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 ?

Código: Selecionar todos

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....
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar do usuário
dbsh
Usuário Nível 3
Usuário Nível 3
Mensagens: 128
Registrado em: 14 Jul 2004 14:19
Localização: ES

Relacionamentos em MySql

Mensagem 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

Código: Selecionar todos

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
010011110010000001110011011101010110001101100101011100110111001101101111001000001110100100100000011000110110111101101110011100110111010001110010011101011110110101100100011011110010000001100001001000000110111001101111011010010111010001100101
01001101011000010111001001100011011011110111001100100000010000010110111001110100011011110110111001101001011011110010000001000100011001010010000001000010011011110110111001101001
0101010001100101011011000011101000100000001010000011001000110111001010010011100100101101001110010011100000110100001100110010110100110101001100100011100100110000
Avatar do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

Relacionamentos em MySql

Mensagem 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.
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Responder