ИНОСТРАННЫЙ КЛЮЧ УНИКАЛЬНЫЙ на одной из двух колонок - PullRequest
1 голос
/ 09 июня 2019

У меня есть две довольно простые таблицы.

-- Create a new table called '[Events]' in schema '[dbo]'
-- Drop the table if it already exists
DROP TABLE IF EXISTS [dbo].[Events]
GO
-- Create the table in the specified schema
CREATE TABLE [dbo].[Events]
(
    [Id] INT NOT NULL PRIMARY KEY IDENTITY, -- Primary Key column
    [ImportTypeId] INT NULL
        REFERENCES [dbo].[ImportTypes](Id),
    [ImportId] NVARCHAR(50) NULL,
    [Title] NVARCHAR(512) NOT NULL,
    [Description] NVARCHAR(2048) NOT NULL,

    CONSTRAINT UQ_Events UNIQUE (ImportId, ImportTypeId),
    INDEX IX_EventTitle ([Title] ASC)
);
GO

-- Create a new table called '[Events]' in schema '[eventful]'
-- Drop the table if it already exists
DROP TABLE IF EXISTS [eventful].[Events]
GO

-- Create the table in the specified schema
CREATE TABLE [eventful].[Events]
(
    [EventfulId] NVARCHAR(50) NOT NULL
        REFERENCES [dbo].[Events](ImportId),
    [ImportDate] DATETIME NOT NULL DEFAULT(GETUTCDATE()),
    [LastImportDate] DATETIME NULL,
    [Url] NVARCHAR(2048) NULL,

    CONSTRAINT PK_EventfulEvents PRIMARY KEY CLUSTERED (EventfulId)
);
GO

Однако это ограничение внешнего ключа вызывает проблемы:

REFERENCES [dbo].[Events](ImportId)

При выполнении скрипта я получаю сообщение об ошибке:

В ссылочной таблице «dbo.Events» нет первичных или потенциальных ключей, соответствующих списку столбцов ссылок во внешнем ключе «FK__Events__Eventful__5B78929E».

Как мне ссылаться только на ImportId в этой таблице? Нужно ли иметь ImportTypeId в таблице [eventful].[Events], чтобы это работало?

1 Ответ

3 голосов
/ 09 июня 2019

FK должен ссылаться на PK или уникальный индекс.В вашем примере ImportId не является уникальным:

CONSTRAINT UQ_Events UNIQUE (ImportId, ImportTypeId) != UNIQUE(ImportId)

Вы можете:

  1. Создать уникальный индекс для одного столбца ImportId

  2. Использовать составное отношение FK на основе двух столбцов

db <> fiddle demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...