Re: [pgbr-geral] Como criar uma FK checando um campo qualquer na tabela referenciada?
Fabrizio, testei neste exemplo e parece ter funcionado. Vou implementar no BD de desenvolvimento e aviso. Abraços Alex 2010/1/5 Fabrízio de Royes Mello fabriziome...@gmail.com 2010/1/4 Alexsander Rosa alexsander.r...@gmail.com Segue exemplo. O último comando gera uma inconsistência que eu gostaria de poder evitar via constraint. A inconsistência é a seguinte: somente produtos-base deveriam ter estoque; neste caso o usuário deve primeiro eliminar o endereço do estoque (movendo os pallets ou algo que o valha) para depois mudar as associações produto-embalagem. Hoje preciso controlar isso via aplicação mas gostaria de ter mais um nível de controle de consistência no banco. Caro Alexsander, Quem sabe a alternativa em anexo seja uma opção... note as modificações que fiz (campo tipo na tabela produtos e tipo na tabela de estoques)... Verifique e voltamos a discutir... Cordialmente, -- Fabrízio de Royes Mello Blog sobre TI: http://fabriziomello.blogspot.com -- Atenciosamente, Alexsander da Rosa Linux User #113925 Extremismo na defesa da liberdade não é defeito. Moderação na busca por justiça não é virtude. -- Barry Goldwater ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Como criar uma FK checando um campo qualquer na tabela referenciada?
2010/1/4 Alexsander Rosa alexsander.r...@gmail.com Segue exemplo. O último comando gera uma inconsistência que eu gostaria de poder evitar via constraint. A inconsistência é a seguinte: somente produtos-base deveriam ter estoque; neste caso o usuário deve primeiro eliminar o endereço do estoque (movendo os pallets ou algo que o valha) para depois mudar as associações produto-embalagem. Hoje preciso controlar isso via aplicação mas gostaria de ter mais um nível de controle de consistência no banco. Caro Alexsander, Quem sabe a alternativa em anexo seja uma opção... note as modificações que fiz (campo tipo na tabela produtos e tipo na tabela de estoques)... Verifique e voltamos a discutir... Cordialmente, -- Fabrízio de Royes Mello Blog sobre TI: http://fabriziomello.blogspot.com DROP TABLE IF EXISTS tmp_estoque; DROP TABLE IF EXISTS tmp_produto; CREATE TABLE tmp_produto ( cod_prod integer primary key, descricao text, prod_base integer, caixa_com integer, tipo integer default 1, -- 1 = Base 2 = Outro (mas prod_base tem que ser = null) CHECK ( (prod_base IS NULL AND tipo = 1) OR (tipo 1) ), FOREIGN KEY (prod_base) REFERENCES tmp_produto(cod_prod) ); CREATE UNIQUE INDEX idx_tmp_tipo ON tmp_produto(cod_prod,tipo); CREATE TABLE tmp_estoque ( posicao_pallet varchar(10) primary key, cod_prod_fk integer not null, tipo_prod_fk integer default 1, quantidade integer, CHECK (tipo_prod_fk = 1), -- Somente Produto Base FOREIGN KEY (cod_prod_fk) REFERENCES tmp_produto(cod_prod), FOREIGN KEY (cod_prod_fk, tipo_prod_fk) REFERENCES tmp_produto(cod_prod, tipo) MATCH FULL ); -- cria um produto e seu estoque INSERT INTO tmp_produto (cod_prod, descricao, prod_base, caixa_com) VALUES (314, 'BLISTER COM DUAS PILHAS', null, null); INSERT INTO tmp_estoque (posicao_pallet, cod_prod_fk, quantidade) VALUES ('ABC-1234', 314, 10); -- cria um novo produto-base INSERT INTO tmp_produto (cod_prod, descricao, prod_base, caixa_com) VALUES(315,'BLISTER COM UMA PILHA',null,null); -- Aqui tenta alterar o Produto Base sem Alterar o Tipo (Viola Check Constraint da Tabela tmp_produto) UPDATE tmp_produto SET prod_base = 315, caixa_com = 2 WHERE cod_prod = 314; -- Aqui tenta alterar o Produto Base Alterando o Tipo (Viola Foreign Key Constraint da Tabela tmp_estoque) UPDATE tmp_produto SET prod_base = 315, caixa_com = 2, tipo = 2 WHERE cod_prod = 314; ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] Como criar uma FK checando um campo qualquer na tabela referenciada?
Tenho duas tabelas, produto e estoque. Em produto a PK é código; há também um par de campos (cod_base, quantidade) onde cod_base é uma FK auto-referenciada. Este par serve para as embalagens: o produto 1234 pode ser uma embalagem com 12 unidades do produto 1231 por exemplo. As unidades (UN, CX, PCT, etc) são tratadas de acordo. Na tabela estoque há um campo código_fk que é FK de produto. Somente produtos-base (isto é, com NULL em cod_base) podem ter registros em estoque. No entanto, às vezes um produto deixa de ser base e passa a ser embalagem*, deixando registros sobrando na tabela estoque; tenho que controlar isso via aplicação mas gostaria de usar o SGBD para garantir esta integridade de forma mais efetiva. Segundo sugestão do IRC, tentei criar uma coluna extra em estoque, deixada sempre em NULL, criando uma nova FK em estoque usando os dois campos de produto (cod_produto e cod_base). Consegui criar esta constraint mas ela não funcionou: valores inválidos ainda puderam ser inseridos. * Exemplo: um blister com 4 pilhas é vendido como base e vem numa embalagem com 50 blisters. Um dia o fabricante resolve fazer blisters com 2 pilhas -- ou o lojista resolve abrir os blisters e vender as pilhas individualmente. -- Atenciosamente, Alexsander da Rosa Linux User #113925 Extremismo na defesa da liberdade não é defeito. Moderação na busca por justiça não é virtude. -- Barry Goldwater ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Como criar uma FK checando um campo qualquer na tabela referenciada?
Olá, 2010/1/4 Alexsander Rosa alexsander.r...@gmail.com Tenho duas tabelas, produto e estoque. Em produto a PK é código; há também um par de campos (cod_base, quantidade) onde cod_base é uma FK auto-referenciada. Este par serve para as embalagens: o produto 1234 pode ser uma embalagem com 12 unidades do produto 1231 por exemplo. As unidades (UN, CX, PCT, etc) são tratadas de acordo. Na tabela estoque há um campo código_fk que é FK de produto. Somente produtos-base (isto é, com NULL em cod_base) podem ter registros em estoque. No entanto, às vezes um produto deixa de ser base e passa a ser embalagem*, deixando registros sobrando na tabela estoque; tenho que controlar isso via aplicação mas gostaria de usar o SGBD para garantir esta integridade de forma mais efetiva. Segundo sugestão do IRC, tentei criar uma coluna extra em estoque, deixada sempre em NULL, criando uma nova FK em estoque usando os dois campos de produto (cod_produto e cod_base). Consegui criar esta constraint mas ela não funcionou: valores inválidos ainda puderam ser inseridos. * Exemplo: um blister com 4 pilhas é vendido como base e vem numa embalagem com 50 blisters. Um dia o fabricante resolve fazer blisters com 2 pilhas -- ou o lojista resolve abrir os blisters e vender as pilhas individualmente. Não entendi. Teria como colocar um exemplo mais claro, por exemplo com o valor que segundo você comentou que foi inserido e não poderia ter acontecido. -- Atenciosamente, Alexsander da Rosa Linux User #113925 Extremismo na defesa da liberdade não é defeito. Moderação na busca por justiça não é virtude. -- Barry Goldwater ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral []s -- JotaComm http://jotacomm.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Como criar uma FK checando um campo qualquer na tabela referenciada?
Segue exemplo. O último comando gera uma inconsistência que eu gostaria de poder evitar via constraint. A inconsistência é a seguinte: somente produtos-base deveriam ter estoque; neste caso o usuário deve primeiro eliminar o endereço do estoque (movendo os pallets ou algo que o valha) para depois mudar as associações produto-embalagem. Hoje preciso controlar isso via aplicação mas gostaria de ter mais um nível de controle de consistência no banco. 2010/1/4 JotaComm jota.c...@gmail.com Olá, 2010/1/4 Alexsander Rosa alexsander.r...@gmail.com Tenho duas tabelas, produto e estoque. Em produto a PK é código; há também um par de campos (cod_base, quantidade) onde cod_base é uma FK auto-referenciada. Este par serve para as embalagens: o produto 1234 pode ser uma embalagem com 12 unidades do produto 1231 por exemplo. As unidades (UN, CX, PCT, etc) são tratadas de acordo. Na tabela estoque há um campo código_fk que é FK de produto. Somente produtos-base (isto é, com NULL em cod_base) podem ter registros em estoque. No entanto, às vezes um produto deixa de ser base e passa a ser embalagem*, deixando registros sobrando na tabela estoque; tenho que controlar isso via aplicação mas gostaria de usar o SGBD para garantir esta integridade de forma mais efetiva. Segundo sugestão do IRC, tentei criar uma coluna extra em estoque, deixada sempre em NULL, criando uma nova FK em estoque usando os dois campos de produto (cod_produto e cod_base). Consegui criar esta constraint mas ela não funcionou: valores inválidos ainda puderam ser inseridos. * Exemplo: um blister com 4 pilhas é vendido como base e vem numa embalagem com 50 blisters. Um dia o fabricante resolve fazer blisters com 2 pilhas -- ou o lojista resolve abrir os blisters e vender as pilhas individualmente. Não entendi. Teria como colocar um exemplo mais claro, por exemplo com o valor que segundo você comentou que foi inserido e não poderia ter acontecido. -- Atenciosamente, Alexsander da Rosa Linux User #113925 Extremismo na defesa da liberdade não é defeito. Moderação na busca por justiça não é virtude. -- Barry Goldwater CREATE TABLE tmp_produto ( cod_prod integer primary key, descricao text, prod_base integer, caixa_com integer, FOREIGN KEY (prod_base) REFERENCES tmp_produto(cod_prod) ); CREATE UNIQUE INDEX idx_tmp_prodbase ON tmp_produto(cod_prod,prod_base); CREATE TABLE tmp_estoque ( posicao_pallet varchar(10) primary key, cod_prod_fk integer not null, campo_nulo integer, quantidade integer, FOREIGN KEY (cod_prod_fk) REFERENCES tmp_produto(cod_prod), FOREIGN KEY (cod_prod_fk,campo_nulo) REFERENCES tmp_produto(cod_prod,prod_base) ); -- cria um produto e seu estoque INSERT INTO tmp_produto VALUES(314,'BLISTER COM DUAS PILHAS',null,null); INSERT INTO tmp_estoque VALUES('ABC-1234',314,null,10); -- cria um novo produto-base INSERT INTO tmp_produto VALUES(315,'BLISTER COM UMA PILHA',null,null); UPDATE tmp_produto SET prod_base = 315, caixa_com = 2 WHERE cod_prod = 314; ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral