簡體   English   中英

我無法在 SQL Server 中的 2 個表之間建立復合關系

[英]I can not make a composite relationship between 2 tables in SQL Server

我的下一個模式,我想相關的表COMPANIES_COUNTRIESTIME_TRACKING_REQUEST_TYPE通過CountryIdCompanyId

數據庫架構

兩個表的腳本如下:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[COMPANIES_COUNTRIES]
(
    [CountryId] [int] NOT NULL,
    [CompanyId] [int] NOT NULL,
    [Active] [bit] NOT NULL,
    [DateCreated] [datetime] NULL,
    [DateUpdated] [datetime] NULL,

    CONSTRAINT [PK_COMPANIES_COUNTRIES] 
        PRIMARY KEY CLUSTERED ([CountryId] ASC, [CompanyId] 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

ALTER TABLE [dbo].[COMPANIES_COUNTRIES] 
    ADD CONSTRAINT [DF_COMPANIES_COUNTRIES_Active] DEFAULT ((1)) FOR [Active]
GO

ALTER TABLE [dbo].[COMPANIES_COUNTRIES]  WITH CHECK 
    ADD CONSTRAINT [FK_COMPANIES_COUNTRIES_COMPANIES] 
        FOREIGN KEY([CompanyId]) REFERENCES [dbo].[COMPANIES] ([Id])
GO

ALTER TABLE [dbo].[COMPANIES_COUNTRIES] CHECK CONSTRAINT [FK_COMPANIES_COUNTRIES_COMPANIES]
GO

ALTER TABLE [dbo].[COMPANIES_COUNTRIES] WITH CHECK 
    ADD CONSTRAINT [FK_COMPANIES_COUNTRIES_COUNTRIES] 
        FOREIGN KEY([CountryId]) REFERENCES [dbo].[COUNTRIES] ([Id])
GO

ALTER TABLE [dbo].[COMPANIES_COUNTRIES] CHECK CONSTRAINT [FK_COMPANIES_COUNTRIES_COUNTRIES]
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'List of countries assigned to each company' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'COMPANIES_COUNTRIES'
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[TIME_TRACKING_REQUEST_TYPE]
(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [CompanyId] [int] NOT NULL,
    [CountryId] [int] NOT NULL,
    [Code] [nchar](3) NOT NULL,
    [Description] [nvarchar](200) NOT NULL,
    [Active] [bit] NOT NULL,

    CONSTRAINT [PK_TIME_TRACKING_REQUEST_TYPE_1] 
        PRIMARY KEY CLUSTERED ([Id] 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

ALTER TABLE [dbo].[TIME_TRACKING_REQUEST_TYPE] 
    ADD CONSTRAINT [DF_TIME_TRACKING_REQUEST_TYPE_Active]  DEFAULT ((1)) FOR [Active]
GO

我試圖與下一個腳本建立復合關系,但沒有奏效:

ALTER TABLE TIME_TRACKING_REQUEST_TYPE WITH CHECK 
    ADD CONSTRAINT [FK_TIME_TRACKING_REQUEST_TYPE_COMPANY_COUNTRY] 
        FOREIGN KEY (CompanyId, CountryId) REFERENCES COMPANIES_COUNTRIES (CompanyId, CountryId);

我收到此錯誤(抱歉,是西​​班牙語):

消息 1776,級別 16,狀態 0,第 1 行
No hay claves principales ni candidatas en la tabla a la que se hace referencia ('COMPANIES_COUNTRIES') que concuerden con la lista de columnas que hace la referencia en la clave externa 'FK_TIME_TRACKING_REQUEST_TYPE_COMPANY_COUNTRY'。

消息 1750,級別 16,狀態 0,第 1 行
沒有 se pudo crear la restricción o el índice。 前部錯誤。

我想將兩個字段都設置為 UNIQUE,但我不能因為我可以重復同一公司和國家/地區的記錄。

你為什么會這樣?

提前致謝。

外鍵引用唯一的“標識符”。 在您的情況下,您的標識符是 COMPANIES_COUNTRIES 上的主鍵(CountryId、CompanyId)。 你的外鍵應該指向那個而不是 (CompanyId, CountryId)

ALTER TABLE [dbo].[TIME_TRACKING_REQUEST_TYPE] ADD CONSTRAINT [FK_TIME_TRACKING_REQUEST_TYPE_COMPANY_COUNTRY] 
    FOREIGN KEY (CountryId, CompanyId) 
    REFERENCES COMPANIES_COUNTRIES (CountryId, CompanyId);

在 COMPANIES_COUNTRIES 上創建一個代理鍵(身份)作為主鍵,並將其用作子表中的 FK。

錯誤信息很清楚。 “引用表 ('COMPANIES_COUNTRIES') 中沒有與外鍵 'FK_TIME_TRACKING_REQUEST_TYPE_COMPANY_COUNTRY' 中引用的列列表匹配的主鍵或候選鍵。消息 1750,級別 16,狀態 0,第 1 行無法創建約束或索引。請參閱上面的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM