none
Problema com criação de Foreign Key RRS feed

  • Pergunta

  •   Bem pessoal tenho uma tabela, IMOVEIS. Nessa tabela tenho dois campos que sao foreign key para uma mesma tabela, estou usando a opção de Design no SQL Server Management Studio. ai quando crio a primeira foreign key normalmente, mas quando tentou criar a do segundo campo ocorre um erro: o erro é esse:

     

    Code Snippet

    'UNIDADES_MEDIDAS' table saved successfully
    'IMOVEIS' table
    - Unable to create relationship 'FK_IMOVEIS_X_UNID_MEDIDA_TOTAL'. 
    Introducing FOREIGN KEY constraint 'FK_IMOVEIS_X_UNID_MEDIDA_TOTAL' on table 'IMOVEIS' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
    Could not create constraint. See previous errors.

     

     

    O codigo de criação da minha tabela é:

     

    Code Snippet

    USE [IMOBILIARIA_WEB]

    GO

    /****** Object: Table [dbo].[IMOVEIS] Script Date: 09/05/2008 18:25:16 ******/

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    SET ANSI_PADDING ON

    GO

    CREATE TABLE [dbo].[IMOVEIS](

    [CODG_IMOVEL] [numeric](18, 0) IDENTITY(1,1) NOT NULL,

    [DESC_IMOVEL] [varchar](100) NOT NULL,

    [CODG_TIPO_IMOVEL] [numeric](18, 0) NOT NULL,

    [CODG_PESSOA_CRIACAO] [numeric](18, 0) NOT NULL,

    [DATA_CRIACAO] [datetime] NOT NULL,

    [CODG_PESSOA_ULTIMA_ALTERACAO] [numeric](18, 0) NOT NULL,

    [DATA_ULTIMA_ALTERACAO] [datetime] NOT NULL,

    [CODG_BAIRRO] [numeric](18, 0) NULL,

    [NUME_QUARTOS] [int] NULL,

    [NUME_SUITES] [int] NULL,

    [AREA_TOTAL] [numeric](14, 2) NULL,

    [CODG_UNIDADE_MEDIDA_AREA_CONSTRUIDA] [numeric](18, 0) NULL,

    [AREA_CONSTRUIDA] [numeric](14, 2) NULL,

    [CODG_UNIDADE_MEDIDA_AREA_TOTAL] [numeric](18, 0) NULL,

    [DESC_LOGRADOURO_ENDERECO] [varchar](50) NULL,

    [DESC_NUMERO_ENDERECO] [varchar](50) NULL,

    [DESC_COMPLEMENTO_ENDERECO] [varchar](50) NULL,

    [INDI_ESTADO] [char](1) NULL,

    CONSTRAINT [PK_IMOVEIS] PRIMARY KEY CLUSTERED

    (

    [CODG_IMOVEL] ASC

    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

    ) ON [PRIMARY]

    GO

    SET ANSI_PADDING OFF

    GO

    ALTER TABLE [dbo].[IMOVEIS] WITH CHECK ADD CONSTRAINT [FK_IMOVEIS__X_BAIRROS] FOREIGN KEY([CODG_BAIRRO])

    REFERENCES [dbo].[BAIRROS] ([CODG_BAIRRO])

    ON UPDATE CASCADE

    ON DELETE CASCADE

    GO

    ALTER TABLE [dbo].[IMOVEIS] CHECK CONSTRAINT [FK_IMOVEIS__X_BAIRROS]

    GO

    ALTER TABLE [dbo].[IMOVEIS] WITH CHECK ADD CONSTRAINT [FK_IMOVEIS_X_UNID_MEDIDA_CONSTRUIDA] FOREIGN KEY([CODG_UNIDADE_MEDIDA_AREA_CONSTRUIDA])

    REFERENCES [dbo].[UNIDADES_MEDIDAS] ([CODG_UNIDADE_MEDIDA])

    ON UPDATE CASCADE

    ON DELETE CASCADE

    GO

    ALTER TABLE [dbo].[IMOVEIS] CHECK CONSTRAINT [FK_IMOVEIS_X_UNID_MEDIDA_CONSTRUIDA]

    GO

    ALTER TABLE [dbo].[IMOVEIS] WITH CHECK ADD CONSTRAINT [CK_IMOVEIS_INDI_ESTADO] CHECK (([INDI_ESTADO]='U' OR [INDI_ESTADO]='N'))

    GO

    ALTER TABLE [dbo].[IMOVEIS] CHECK CONSTRAINT [CK_IMOVEIS_INDI_ESTADO]

     

     

      Como podem ver tenho o campo CODG_UNIDADE_MEDIDA_AREA_CONSTRUIDA e o CODG_UNIDADE_MEDIDA_AREA_TOTAL, que fazem referencia a tabela UNIDADES_MEDIDAS. Na verdade deveria, tanto que para o campo CODG_UNIDADE_MEDIDA_AREA_TOTAL a Foreign Key nem é gerada no script. O que devo fazer? Não posso ter em uma tabela dois campos Foreig Key para uma outra tabela comum? Criei dois campos pois posso ter unidades de medidas diferentes para a AREA_CONTRUIDA e para a AREA_TOTAL.

     

      Desde já agradeço a ajuda de todos.

    sexta-feira, 5 de setembro de 2008 21:29

Todas as Respostas

  • Boa Noite,

     

    Não há nenhum problema em ter duas colunas como FK apontando para a mesma PK. Essa é uma situação até comum em processos de modelagem e totalmente previstas pelas teorias relacionais. O que acredito é que algumas vezes os diagramas do SQL Server podem fazer inversões no lado do relacionamento e levar a situações recursivas que não são de fato permitidas em nenhum SGBD. Eu recomendaria que você criasse via script.

     

    Crie o primeiro relacionamento, copie o script e mude a coluna para o outro relacionamento.

     

    [ ]s,

     

    Gustavo

    sexta-feira, 5 de setembro de 2008 22:35