Emilio Fernandez
Emilio Fernandez

Reputation: 35

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

I have the next schema where I want to relation the tables COMPANIES_COUNTRIES and TIME_TRACKING_REQUEST_TYPE by CountryId and CompanyId.

DB Schema

The scripts for both tables are the next:

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

I tried to make a composite relationship with next script but didn't work:

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);

I get this error (sorry, it is in Spanish):

Msg 1776, Level 16, State 0, Line 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'.

Msg 1750, Level 16, State 0, Line 1
No se pudo crear la restricción o el índice. Vea los errores anteriores.

I thought to put both fields as UNIQUE, but I can not due I can repeat records for the same company and country.

Do you why is happening that?

Thanks in advance.

Upvotes: 1

Views: 62

Answers (2)

lptr
lptr

Reputation: 6788

Foreign keys reference unique "identifiers". In your case, your identifier is the primary key (CountryId, CompanyId) on COMPANIES_COUNTRIES. Your foreign key should point to that and not to (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);

Upvotes: 1

Israel H.
Israel H.

Reputation: 64

Create a surrogate key (identity) as a primary key on COMPANIES_COUNTRIES and use it as FK in the child table.

The error message is clear. "There are no primary or candidate keys in the referenced table ('COMPANIES_COUNTRIES') that match the list of columns referenced in the foreign key 'FK_TIME_TRACKING_REQUEST_TYPE_COMPANY_COUNTRY'. Msg 1750, Level 16, State 0, Line 1 Could not create constraint or index. See the errors above.

Upvotes: 0

Related Questions