首页 > 解决方案 > SQL:如何拥有具有自动 SET 行为的非唯一“身份列”?

问题描述

这个想法

因此,标题可能看起来有些模糊,但这是我想要的(在 Microsoft SQL Server 中,最新版本),可用于 ASP.NET C# 应用程序:

附加的“逻辑同一性”列应具有以下属性

最后一点可能是最难实现的,所以这就是问题所在:

问题

当 INSERT 脚本未提供强制值时,如何强制(最好在数据库级别)始终将强制值设置为唯一值?

想法

我还考虑过:

上下文

标签: sql-serverentity-framework-6schemasql-insert

解决方案


一种选择是SEQUENCE分配有DEFAULT约束的值。不可变要求是最大的挑战,因为 SQL Server 不提供一种声明方式来指定只读列,因此需要触发器实现。

下面是示例 DDL。我不知道这种技术是否会给 EF 带来挑战。

CREATE SEQUENCE SQ_Example_Sequence
    AS int START WITH 1 INCREMENT BY 1;
GO
CREATE TABLE dbo.Example(
     IdentityColumn int NOT NULL IDENTITY
        CONSTRAINT PK_Example PRIMARY KEY CLUSTERED
    ,SomeDataColumn int
    ,SequenceColumn int NOT NULL 
        CONSTRAINT DF_Example_SequenceColumn DEFAULT NEXT VALUE FOR SQ_Example_Sequence
);
GO
CREATE TRIGGER TR_Example_Update
    ON dbo.Example FOR UPDATE 
AS
IF EXISTS(SELECT 1
    FROM inserted
    JOIN deleted ON inserted.IdentityColumn = deleted.IdentityColumn
    WHERE inserted.SequenceColumn <> deleted.SequenceColumn
    )
BEGIN
    THROW 50000, 'SequenceColumn value cannot be changed', 16;
END;
GO

推荐阅读