Como definir esta constraint ?
Olá,
Tenho a seguinte situação
Em uma tabela tabela_A , tenho os campos A1 e A2.
Os registros desta tabela tabela_A, serão sempre "filhos" de uma tabela chamada tabela_Mae1 ou de uma tabela chamada tabela_Mae2.
Se o vínculo for com a tabela_Mae1, a chave estará no campo A1 e se o vínculo for com a tabela_Mae2 a chave estará no campo A2.
Com definir uma constraint que obrigue a termos um vínculo pelo menos ou via campo A1 ou via campo A2 ?
Obrigado !
Respostas
Olá Mike_Kla,
Esta meio consufo, mas segue um exemplo de acordo com o meu entendimento com a sua necessidade.-- ENTIDADE MAE 1
CREATE TABLE TbMae1
(
IdMae1 TINYINT
CONSTRAINT PkIdMae1 PRIMARY KEY
)
GO
-- ENTIDADE MAE 2
CREATE TABLE TbMae2
(
IdMae2 TINYINT
CONSTRAINT PkIdMae2 PRIMARY KEY
)
GO
-- INTIDADE FILHA
CREATE TABLE TbFilha
(
IdMae1 TINYINT
CONSTRAINT FkIdMae1 FOREIGN KEY REFERENCES TbMae1(IdMae1) NULL
,IdMae2 TINYINT
CONSTRAINT FkIdMae2 FOREIGN KEY REFERENCES TbMae2(IdMae2) NULL
,NoTabela VARCHAR(20)
)
-- INSERINDO VALORES
INSERT INTO TbMae1
VALUES(1)
,(2)
,(3)
,(4)
GO
-- INSERINDO VALORES
INSERT INTO TbMae2
VALUES(5)
,(6)
,(7)
,(8)
GO
-- INSERINDO VALORES
INSERT INTO TbFilha(IdMae1, IdMae2, NoTabela)
VALUES(1,NULL,'Tabela Mae 1')
,(NULL,5,'Tabela Mae 2')
GO
-- CONSULTA
SELECT * FROM TbFilha
Resultado.IdMae1 IdMae2 NoTabela
------ ------ --------------------
1 NULL Tabela Mae 1
NULL 5 Tabela Mae 2
Caso tenha lhe ajudado não se esqueça de marca como útil, só assim ajudará a melhorar a qualidade do fórum.
Heberton Melo
MCP | MCTS em SQL Server 2008 | Projetista de Dados
Blog: http://heberton-melo.spaces.live.com- Marcado como RespostaFernanda SimõesMSFT, Moderadorquarta-feira, 28 de outubro de 2009 13:23
Mike,
Tbm achei um pouco confuso, mas eu tbm pensei na mesma solução do Heberton, acredito que o que vc precisa é so adicionar dois campos na tabela e relacionar elas em cada tabela pai, pois um mesmo campo vc não vai poder relacionar tabelas diferentes pois as tabelas não terao os mesmos registros.
ou seja:
tab1 tem registro de 1 a 5,
tab2 tem registro de 6 a 10
ao inserir na tab filha o reg 1 vai dar conflito na tab2 q não existe o reg 1 (por isto o Heberton criou um coluna para cada tab)
Agora se os mesmos registros existirem nas duas Tabs este problema nao ocorrerá
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!- EditadoMarcelo Fernandes da Silva terça-feira, 27 de outubro de 2009 15:16
- Marcado como RespostaFernanda SimõesMSFT, Moderadorquarta-feira, 28 de outubro de 2009 13:23
- Olá Mike.
Se eu entendi, você quer isso?
ALTER TABLE Tabela WITH CHECK ADD CONSTRAINT [CK_Tabela] CHECK ((fkIdColuna1 IS NOT NULL or fkIdColuna2 IS NOT NULL))
Ai você não consegue inserir nulo nas duas colunas. Pelo menos uma tem que ter valor.
[]'s- Sugerido como RespostaAlexandre VM quinta-feira, 5 de novembro de 2009 13:43
- Marcado como RespostaMike_Kla segunda-feira, 23 de novembro de 2009 13:40
Todas as Respostas
- Mike,
Peço desculpas mas não consegui entender!!!!
Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA - Olá Junior,
Imagine a seguinte situação...
Tenho uma tabela de notas fiscais chamada notas_fiscais_1 e outra chamada notas_fiscais_2.
Para cada nota tenho produtos na tabela produtos_das_notas.
Cada registro na tabela produtos_das_notas deve estar obrigatóriamente vinculado ou a tabela notas_fiscais_1 ou a notas_fiscais_2.
Obrigado. Olá Mike_Kla,
Esta meio consufo, mas segue um exemplo de acordo com o meu entendimento com a sua necessidade.-- ENTIDADE MAE 1
CREATE TABLE TbMae1
(
IdMae1 TINYINT
CONSTRAINT PkIdMae1 PRIMARY KEY
)
GO
-- ENTIDADE MAE 2
CREATE TABLE TbMae2
(
IdMae2 TINYINT
CONSTRAINT PkIdMae2 PRIMARY KEY
)
GO
-- INTIDADE FILHA
CREATE TABLE TbFilha
(
IdMae1 TINYINT
CONSTRAINT FkIdMae1 FOREIGN KEY REFERENCES TbMae1(IdMae1) NULL
,IdMae2 TINYINT
CONSTRAINT FkIdMae2 FOREIGN KEY REFERENCES TbMae2(IdMae2) NULL
,NoTabela VARCHAR(20)
)
-- INSERINDO VALORES
INSERT INTO TbMae1
VALUES(1)
,(2)
,(3)
,(4)
GO
-- INSERINDO VALORES
INSERT INTO TbMae2
VALUES(5)
,(6)
,(7)
,(8)
GO
-- INSERINDO VALORES
INSERT INTO TbFilha(IdMae1, IdMae2, NoTabela)
VALUES(1,NULL,'Tabela Mae 1')
,(NULL,5,'Tabela Mae 2')
GO
-- CONSULTA
SELECT * FROM TbFilha
Resultado.IdMae1 IdMae2 NoTabela
------ ------ --------------------
1 NULL Tabela Mae 1
NULL 5 Tabela Mae 2
Caso tenha lhe ajudado não se esqueça de marca como útil, só assim ajudará a melhorar a qualidade do fórum.
Heberton Melo
MCP | MCTS em SQL Server 2008 | Projetista de Dados
Blog: http://heberton-melo.spaces.live.com- Marcado como RespostaFernanda SimõesMSFT, Moderadorquarta-feira, 28 de outubro de 2009 13:23
Mike,
Tbm achei um pouco confuso, mas eu tbm pensei na mesma solução do Heberton, acredito que o que vc precisa é so adicionar dois campos na tabela e relacionar elas em cada tabela pai, pois um mesmo campo vc não vai poder relacionar tabelas diferentes pois as tabelas não terao os mesmos registros.
ou seja:
tab1 tem registro de 1 a 5,
tab2 tem registro de 6 a 10
ao inserir na tab filha o reg 1 vai dar conflito na tab2 q não existe o reg 1 (por isto o Heberton criou um coluna para cada tab)
Agora se os mesmos registros existirem nas duas Tabs este problema nao ocorrerá
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!- EditadoMarcelo Fernandes da Silva terça-feira, 27 de outubro de 2009 15:16
- Marcado como RespostaFernanda SimõesMSFT, Moderadorquarta-feira, 28 de outubro de 2009 13:23
Olá Marcelo,
É isso mesmo Marcelo, sua explicação ficou clara em relação à dúvida do Mike.
Caso tenha lhe ajudado não se esqueça de marca como útil, só assim ajudará a melhorar a qualidade do fórum.
Heberton Melo
MCP | MCTS em SQL Server 2008 | Projetista de Dados
Blog: http://heberton-melo.spaces.live.com- Olá Heberton,
Acho que é por ai mas sua solução não cobre, segundo meu entendimento, a obrigatoriedade de termos uma FOREIGN KEY pelo menos ou seja eu poderia ter em TbFilha registros com os campos IdMae1 e IdMae2 nulos correto ?
Obrigado.
PS : muito obrigado a todos voces pelo tempo dispendido a esta minha questão. Olá Mike_Kla,
Isso mesmo Mike nesse meu exemplo irá sim aceitar valores nulos, mas veja bem, o objetivo de uma FOREIGN KEY é manter a integridade referencial entre as entidades relacionadas, ou seja, só posso ter dados no campo ta entidade filha caso já exista o mesmo valor na entidade pai, mas isso não quer dizer que temos que ter a obrigatoriedade de colocar um valor no campo que possui a CONSTRAINT FOREIGN KEY.
Algumas pessoas estão acostumadas sempre que criar uma CONSTRAINT FOREIGN KEY definir a mesmo como NOT NULL, não aceitar valores nulos, porem não é nenhum erro definir o mesmo como NULL, aceitar valores nulos.
Com isso aceitamos valores nulos porem só será aceito valores que já existam na entidade pai.
Caso tenha lhe ajudado não se esqueça de marca como útil, só assim ajudará a melhorar a qualidade do fórum.
Heberton Melo
MCP | MCTS em SQL Server 2008 | Projetista de Dados
Blog: http://heberton-melo.spaces.live.com- Olá Heberton,
Concordo com voce com relação ao objetivo das FK e espero ter sido mais claro em minha questão. Além da integridade das chaves , eu preciso criar uma forma de obrigar a que pelo menos um das chaves exista na tabela filha.
Valeu. - Olá Mike.
Se eu entendi, você quer isso?
ALTER TABLE Tabela WITH CHECK ADD CONSTRAINT [CK_Tabela] CHECK ((fkIdColuna1 IS NOT NULL or fkIdColuna2 IS NOT NULL))
Ai você não consegue inserir nulo nas duas colunas. Pelo menos uma tem que ter valor.
[]'s- Sugerido como RespostaAlexandre VM quinta-feira, 5 de novembro de 2009 13:43
- Marcado como RespostaMike_Kla segunda-feira, 23 de novembro de 2009 13:40
- Obrigado a todos.
Partricio,
Era isto mesmo que eu procurava.
Valeu.


