none
Como criar uma relação 1:1 no SQL Managment RRS feed

  • Pergunta

  • Olá entendo pouco de SQL, mas fiz banco de dados na faculdade, e lá a gente criava modelos de bancos as vezes com relação 1:1. 

    Eu tenho essa relação conforme imagem abaixo, que gostaria de fosse 1:1, porque outras tabelas também vão precisar de ter endereço, e não queria duplicar isso em todas as tabelas. Porém quando eu deletasse um "Colaborador" gostaria que deletasse o "Endereço" correspondente. E da forma que fiz está ao contrário. Quando deleto "Colaborador" o "Endereço" fica, só se deletar o "Endereço" que deleta o "Colaborador" assim tá errado. 

    Eu consigo fazer  isso tirando o "CodEndereco" da tabela "Colaborador" e colocando o "CodColaborador" na tabela "Endereço", ai o DELETE CASCATE vai funcionar corretamente, porém ai vou ter que colocar além de "CodColaborador", também "CodCliente" para criar uma relação de Endereço_Cliente. Essa seria a forma correta mesmo? Ainda sim seria uma relação 1:n, mas pelo menos o DELETE CASCATE iria funcionar corretamente. 

    Gostaria se tem como implementar a relação 1:1 no SQL Management

    quarta-feira, 21 de fevereiro de 2018 13:12

Respostas

  • No Diagrama do Sql server, não tem como fazer isso , mas vc pode fazer o relacionamento 1:1 via script

    Adicionando uma restrição UNIQUE na chave que vc quer .

    exemplo ,sabendo que uma pessoa fisica só pode estar associado a um registro na tabela de pessoa

    CREATE TABLE [dbo].[Pessoas] (
        [IdPessoa] [INT] NOT NULL PRIMARY KEY,
        [Nome] [VARCHAR](50) NULL, );
    
    
    
    CREATE TABLE [dbo].[PessoaFisica] (
        [IdPessoaFisica] [INT] NOT NULL PRIMARY KEY,
        [IdPessoa] [INT] NOT NULL
            FOREIGN KEY REFERENCES dbo.Pessoas (IdPessoa),
        [CPF] [VARCHAR](15) NULL);

    basta criar a restrição 

    ALTER TABLE dbo.PessoaFisica ADD CONSTRAINT UniqueIdPessoa UNIQUE(IdPessoa)

    Wesley Neves - Brasilia-DF     

    https://wesleyneves.wordpress.com/

    SELECT Tab.[that's me:]

    FROM

    (

        VALUES

            ('Wesley Neves'),

            ('Analista.NET'),

            ('Pós Graduando em Banco de Dados com ênfase em BI'),

            ('MTA -SQL Server'),

            ('MTA -Web Developed')

    ) AS Tab ("that's me:");


    "Se a resposta for útil ou ajudar ,não esqueça de marcar"





    Wesley Neves

    quarta-feira, 21 de fevereiro de 2018 19:08
  • Consegui Obrigada a todos 

    CREATE UNIQUE NONCLUSTERED INDEX [UniqueExceptNulls]
    ON [Customers] (SSN)
    WHERE [SSN] IS NOT NULL

    sexta-feira, 23 de fevereiro de 2018 13:59

Todas as Respostas

  • No Diagrama do Sql server, não tem como fazer isso , mas vc pode fazer o relacionamento 1:1 via script

    Adicionando uma restrição UNIQUE na chave que vc quer .

    exemplo ,sabendo que uma pessoa fisica só pode estar associado a um registro na tabela de pessoa

    CREATE TABLE [dbo].[Pessoas] (
        [IdPessoa] [INT] NOT NULL PRIMARY KEY,
        [Nome] [VARCHAR](50) NULL, );
    
    
    
    CREATE TABLE [dbo].[PessoaFisica] (
        [IdPessoaFisica] [INT] NOT NULL PRIMARY KEY,
        [IdPessoa] [INT] NOT NULL
            FOREIGN KEY REFERENCES dbo.Pessoas (IdPessoa),
        [CPF] [VARCHAR](15) NULL);

    basta criar a restrição 

    ALTER TABLE dbo.PessoaFisica ADD CONSTRAINT UniqueIdPessoa UNIQUE(IdPessoa)

    Wesley Neves - Brasilia-DF     

    https://wesleyneves.wordpress.com/

    SELECT Tab.[that's me:]

    FROM

    (

        VALUES

            ('Wesley Neves'),

            ('Analista.NET'),

            ('Pós Graduando em Banco de Dados com ênfase em BI'),

            ('MTA -SQL Server'),

            ('MTA -Web Developed')

    ) AS Tab ("that's me:");


    "Se a resposta for útil ou ajudar ,não esqueça de marcar"





    Wesley Neves

    quarta-feira, 21 de fevereiro de 2018 19:08
  • Olá, cara, pelo que entendi você está fazendo certo...
    Acho sim que você deve levar o "CodColaborador" e "CodCliente" para dentro da tabela Endereço, como FK. Nem por isso a relação deixaria de ser 1:1, pois cada registro da tabela Endereço estaria relacionado a um registro da tabela Cliente ou Colaborador e vice-versa.


    quarta-feira, 21 de fevereiro de 2018 21:03
  • Deu certo, era isso mesmo que queria, mais outra dúvida eu consigo fazer essa restrição ignorar quando for nulo?

    No caso ela ver  o valor nulo como duplicado também.

    sexta-feira, 23 de fevereiro de 2018 13:37
  • Consegui Obrigada a todos 

    CREATE UNIQUE NONCLUSTERED INDEX [UniqueExceptNulls]
    ON [Customers] (SSN)
    WHERE [SSN] IS NOT NULL

    sexta-feira, 23 de fevereiro de 2018 13:59