两列之一上的“唯一外键”

时间:2019-06-09 12:03:05

标签: sql-server tsql

我有两个非常简单的表。

-- 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 个答案:

答案 0 :(得分:3)

FK必须引用PK或唯一索引。在您的示例中,ImportId不是唯一的

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

您可以:

  1. 在单列ImportId

  2. 上创建唯一索引
  3. 使用基于两列的复合FK关系

db<>fiddle demo