Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal estou com um problema que não consigo resolver. Tenho 3 tabelas com 2 campos comuns "id" e "processo".
Gostava de fazer o upload de uma tabela e automáticamente serem preenchidos os campos das outras. É possível!?
Li qualquer coisa como utilizar "foreign key ..." agora fazer?
obrigado
Posta a estrutura de cada tabela, para que serve cada uma. Assim será mais fácil entender o que você quer fazer.
Ok aqui vai:
Tabela processo
CREATE TABLE IF NOT EXISTS `processo` (
`id` int(10) unsigned NOT NULL auto_increment,
`processo` char(10) NOT NULL,
`data` date NOT NULL,
`angariador` varchar(100) NOT NULL,
`vendedor` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `processo` (`processo`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=57 ;
Tabela vendedores
CREATE TABLE IF NOT EXISTS `vendedores` (
`id` int(10) unsigned NOT NULL auto_increment,
`processo` char(10) NOT NULL,
`utilizador` varchar(30) NOT NULL,
`data_actualizacao` date NOT NULL,
`data` date NOT NULL,
`nome` varchar(100) NOT NULL,
`bi` char(10) NOT NULL,
`cont` char(10) NOT NULL,
`est_civil` varchar(50) NOT NULL,
`casamento` varchar(50) NOT NULL,
`esposa` varchar(100) default NULL,
`bi_esposa` char(10) default NULL,
`cont_esposa` char(10) default NULL,
`morada` varchar(100) NOT NULL,
`telefone` char(10) default NULL,
`telm` char(10) default NULL,
`mail` varchar(50) default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `processo` (`processo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
Tabela compradores
CREATE TABLE IF NOT EXISTS `compradores` (
`id` int(10) unsigned NOT NULL auto_increment,
`processo` char(10) NOT NULL,
`utilizador` varchar(30) NOT NULL,
`data_actualizacao` date NOT NULL,
`data` date NOT NULL,
`nome` varchar(100) NOT NULL,
`bi` char(10) NOT NULL,
`cont` char(10) NOT NULL,
`est_civil` varchar(50) NOT NULL,
`casamento` varchar(50) NOT NULL,
`esposa` varchar(100) default NULL,
`bi_esposa` char(10) default NULL,
`cont_esposa` char(10) default NULL,
`morada` varchar(100) NOT NULL,
`telefone` char(10) default NULL,
`telm` char(10) default NULL,
`mail` varchar(50) default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `processo` (`processo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
A site tem uma página de inserção de processo. Quando inserir novo processo a ideia era fazer o update nas 3 tabelas.Pelo que entendi, as tabelas não estão normalizadas. O bom para se trabalhar com integridade relacional é que seu banco se encontre na terceira forma normal.
Na tabela 'processo', por exemplo, você tem o campo vendedor, que na verdade deveria abrigar a chave estrangeira que faz referência ao vendedor da tabela vendedor (faria referência à chave primária da tabela vendedor) e o que se tem ali é um campo char, que provavelmente irá abrigar o nome do vendedor (se o nome do vendedor for a chave primária, está errado. Aliás, campos char são péssimos para se utilizar em chaves).
Sendo assim, recomendo que você primeiro normalize o banco e em seguida implemente a integridade relacional, que é o que imagino, você esteja buscando,
Não sei se tem como inserir registro em uma tabela e consequentemente o registro se replicar para outras tabelas porque isso fere a atomicidade dos registros, significando que a base (como disse no início) não se encontra normalizada.
Caso queira aproveitar a estrutura atual do banco, imagino que você deverá realizar a integridade relacional "na unha", use controle de transações para isso. Funciona assim:
Você executa um "begin", isso vai dizer ao SGBD que uma transação vai se iniciar.
Execute os inserts.
Execute um 'commit'.
Se alguma inserção falhar, os outros também irão falhar.
BEGIN;
INSERT INTO TABELA1 (campo1, campo2) VALUES (valor1, valor2);
INSERT INTO TABELA2 (campo1, campo2) VALUES (valor1, valor2);
INSERT INTO TABELA3 (campo1, campo2) VALUES (valor1, valor2);
COMMIT; // se tudo der certo, execute o commit
ROLLBACK; // se houver um erro em alguma query, execute o ROLLBACK pra desfazer as inserções>
Pelo que entendi, as tabelas não estão normalizadas. O bom para se trabalhar com integridade relacional é que seu banco se encontre na terceira forma normal.
Na tabela 'processo', por exemplo, você tem o campo vendedor, que na verdade deveria abrigar a chave estrangeira que faz referência ao vendedor da tabela vendedor (faria referência à chave primária da tabela vendedor) e o que se tem ali é um campo char, que provavelmente irá abrigar o nome do vendedor (se o nome do vendedor for a chave primária, está errado. Aliás, campos char são péssimos para se utilizar em chaves).
Sendo assim, recomendo que você primeiro normalize o banco e em seguida implemente a integridade relacional, que é o que imagino, você esteja buscando,
Não sei se tem como inserir registro em uma tabela e consequentemente o registro se replicar para outras tabelas porque isso fere a atomicidade dos registros, significando que a base (como disse no início) não se encontra normalizada.
Caso queira aproveitar a estrutura atual do banco, imagino que você deverá realizar a integridade relacional "na unha", use controle de transações para isso. Funciona assim:
Você executa um "begin", isso vai dizer ao SGBD que uma transação vai se iniciar.
Execute os inserts.
Execute um 'commit'.
Se alguma inserção falhar, os outros também irão falhar.
BEGIN;
INSERT INTO TABELA1 (campo1, campo2) VALUES (valor1, valor2);
INSERT INTO TABELA2 (campo1, campo2) VALUES (valor1, valor2);
INSERT INTO TABELA3 (campo1, campo2) VALUES (valor1, valor2);
COMMIT; // se tudo der certo, execute o commit
ROLLBACK; // se houver um erro em alguma query, execute o ROLLBACK pra desfazer as inserções
Oi Marcio
Primeiro obrigado pela ajuda. Não entendi direito o seu primeiro parágrafo "Pelo que entendi, as tabelas não estão normalizadas. O bom para se trabalhar com integridade relacional é que seu banco se encontre na terceira forma normal.".
O campo vendedor da tabela Processo não tem nada a ver com a tabela vendedores. O campo que eu queria relacionar é o "Processo", dai aparecer nas 3 tabelas.
Boa noite xtroino e Márcio,
o que o Márcio quis dizer é sobre a "normalização" do banco de dados.
O link irá dar mais luz a você:
http://pt.wikipedia.org/wiki/Banco_de_dados_relacional
O seu banco de dados esta com o relacionamento baseado em um char e não na PK, isso em cada tabela.
O uso de char como id da tabela não é legal, pois os processos irão ficar lentos e não poderá ser normalizado o banco.
abraços,
léo
Desde já obrigado pela ajuda.
Na vossa opinião (se possível) como deveriam ficar as tabelas, considerando que a única chave que eu quero relacionar entre elas é o PROCESSO.
Relativamente ao campo CHAR é porque os dados a inserir no campo PROCESSO são por ex.: 1018/08 - como podia ficar esse campo?
http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
Posta a estrutura de cada tabela, para que serve cada uma. Assim será mais fácil entender o que você quer fazer.