Помогите с первичным ключом в SQL Server (SSMS)

У меня есть таблицы Назначения и Штат и мне нужно сделать внешний ключ в диаграмме, но у меня ошибка

  • 'Назначения' table saved successfully 'Штат' table
  • Unable to create relationship 'FK_Штат_Назначения'.
    The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_Штат_Назначения". The conflict occurred in database "pr1-2", table "dbo.Назначения", column 'номер_записи'.

Назначения

USE [pr1-2]
GO

/****** Object:  Table [dbo].[Назначения]    Script Date: 2/4/2024 3:40:49 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Назначения](
    [номер_записи] [int] NOT NULL,
    [кодОтдела] [int] NOT NULL,
    [кодДолжности] [int] NOT NULL,
    [номер] [int] NOT NULL,
    [датаПриема] [date] NOT NULL,
    [датаУвольнения] [date] NULL,
    [статус] [nvarchar](100) NULL,
 CONSTRAINT [PK_Назначения] PRIMARY KEY CLUSTERED 
(
    [номер_записи] 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].[Назначения]  WITH CHECK ADD  CONSTRAINT [FK_Назначения_Сотрудники] FOREIGN KEY([номер])
REFERENCES [dbo].[Сотрудники] ([номер])
GO

ALTER TABLE [dbo].[Назначения] CHECK CONSTRAINT [FK_Назначения_Сотрудники]
GO

Штат

USE [pr1-2]
GO

/****** Object:  Table [dbo].[Штат]    Script Date: 2/4/2024 3:41:01 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Штат](
    [кодОтдела] [int] NOT NULL,
    [кодДолжности] [int] NOT NULL,
    [Кол_во] [int] NOT NULL,
 CONSTRAINT [PK_Штат] PRIMARY KEY CLUSTERED 
(
    [кодОтдела] ASC,
    [кодДолжности] 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].[Штат]  WITH CHECK ADD  CONSTRAINT [FK_Штат_Должности] FOREIGN KEY([кодДолжности])
REFERENCES [dbo].[Должности] ([кодДолжности])
GO

ALTER TABLE [dbo].[Штат] CHECK CONSTRAINT [FK_Штат_Должности]
GO

ALTER TABLE [dbo].[Штат]  WITH CHECK ADD  CONSTRAINT [FK_Штат_Отделы] FOREIGN KEY([кодОтдела])
REFERENCES [dbo].[Отделы] ([кодОтдела])
GO

ALTER TABLE [dbo].[Штат] CHECK CONSTRAINT [FK_Штат_Отделы]
GO

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения


Ответы (1 шт):

Автор решения: rotabor

Судя по тексту ошибки, вы сделали не то, что хотели (кодДолжности из Таблицы Штат к кодДолжности в таблице Назначения).

Обратите внимание на шаги: введите сюда описание изображения

Там нужно выбрать [кодДолжности]: введите сюда описание изображения

Учтите, что у вас ключ "PK_Штат = [кодОтдела] & [кодДолжности]". И связь между таблицами длжна быть соответствующей.

P. S. Ещё раз. В Штате уникальность записей по комбинации [кодОтдела] & [кодДолжности]. Поэтому нельзя связать Назначения и Штат только по [кодОтдела] или по [кодДолжности]. Нужно по обоим полям. Но тогда каждое из этих полей в Штате должно быть с уникальными значениями, что противоречит начальным данным ([кодОтдела] - уникальное, а [кодДолжности] - нет).

Поэтому, нужно добавить в Штат уникальное поле [код штата], а в Назначениях заменить [кодОтдела] и [кодДолжности] на [код штата], и связывать две таблицы по [код штата].

→ Ссылка