首页 > 解决方案 > SQL Server 2017 中的时态表是否支持外键?

问题描述

如果我尝试将外键添加到 Visual Studio 中的临时表,它无法解析对主表的引用。无论该表也是临时表还是不是临时表,都会发生这种情况。

文档说你不能在临时表的历史表中拥有外键......但他们并没有说你不能在临时表本身中拥有它们。

可能吗 ?

CREATE TABLE [Doc].[Document]
(
    [Id] INT NOT NULL PRIMARY KEY IDENTITY,
    [SysStart] DATETIME2 (7) GENERATED ALWAYS AS ROW START NOT NULL DEFAULT CAST('1900-1-1 00:00:00.0000000' AS datetime2),
    [SysEnd] DATETIME2 (7) GENERATED ALWAYS AS ROW END NOT NULL DEFAULT CAST('9999-12-31 12:59:59.9999999' AS datetime2), 
    [Name] NVARCHAR(250) NOT NULL, 
    [TypeId] INT NOT NULL, 
    [InActive] BIT NOT NULL DEFAULT 0, 
    [UpsertedBy] NVARCHAR(100) NOT NULL, 
    [DateAndTime] DATE NOT NULL DEFAULT getdate(), 

    CONSTRAINT [FK_Document_ToTable] 
        FOREIGN KEY ([TypeId]) **REFERENCES [Type]([Id])**, 

    PERIOD FOR SYSTEM_TIME ([SysStart], [SysEnd])
)
WITH (SYSTEM_VERSIONING = ON(HISTORY_TABLE=[Doc].[Document_HISTORY], DATA_CONSISTENCY_CHECK=ON))

标签: sql-servertemporal-tables

解决方案


是的,这是完全可能的。

以下工作正常

CREATE TABLE Foo(FooId INT PRIMARY KEY);


CREATE TABLE Bar
(
    [Id] INT NOT NULL PRIMARY KEY IDENTITY,
    FooId INT REFERENCES Foo, /*Works fine*/
    [SysStart] DATETIME2 (7) GENERATED ALWAYS AS ROW START NOT NULL DEFAULT CAST('1900-1-1 00:00:00.0000000' AS datetime2),
    [SysEnd] DATETIME2 (7) GENERATED ALWAYS AS ROW END NOT NULL DEFAULT CAST('9999-12-31 12:59:59.9999999' AS datetime2), 
    PERIOD FOR SYSTEM_TIME ([SysStart], [SysEnd])
)
WITH (SYSTEM_VERSIONING = ON)

推荐阅读