有没有办法拥有唯一约束而不是唯一索引?

Ale*_*sko 5 sql-server unique-constraint

查看 Microsoft 文档,它说创建唯一约束时,会自动创建唯一索引。

是否有一个技巧/解决方法来拥有一个唯一的约束而不是一个唯一的索引,所以它不占用空间?

Jon*_*ite 13

合理的答案:没有。

你真的应该让它创建唯一索引并让它完成它的工作。空间便宜。

如果您使您想要的列成为唯一的聚集索引键,那么它不会花费您任何额外的磁盘空间,但如果您的查询不通过唯一列,它可能会减慢对表的访问。

不太合理的答案:是的。

但它会消耗 CPU、增加磁盘 I/O 并减慢几乎所有内容。

AFTER在表上放置一个触发器,并让它计算基表中要使其唯一的列的行数。如果计数大于 0,则回滚事务。

示例(如何这样做):

CREATE TABLE dbo.Test
    (
    TestID INT NOT NULL PRIMARY KEY IDENTITY(1,1)
    , TestValue VARCHAR(100) NOT NULL
    );

GO

CREATE TRIGGER trg_TestInsert ON dbo.Test AFTER INSERT, UPDATE
AS
BEGIN

    DECLARE @DuplicateCount INT;
    SET @DuplicateCount = 0;

    WITH CTE_Count AS
        (
        SELECT TestValue, COUNT(*) AS TestValueCount
        FROM dbo.Test
        GROUP BY TestValue
        )
    SELECT @DuplicateCount = COUNT(TestValue)
    FROM CTE_Count
    WHERE TestValueCount >=2;

    IF @DuplicateCount >= 1
    BEGIN
        ROLLBACK;
    END

END;

GO

/** Test Insert Statement */
INSERT INTO dbo.Test (TestValue)
VALUES ('TestMe');

INSERT INTO dbo.Test (TestValue)
VALUES ('TestYou');

--HINT: This one will fail.
INSERT INTO dbo.Test (TestValue)
VALUES ('TestYou');

SELECT TestID, TestValue FROM dbo.Test;

--Cleanup.
DROP TABLE dbo.Test;
Run Code Online (Sandbox Code Playgroud)

  • 嘿乔纳森,我冒昧地给你的两个建议一个稍微不同的旋转:合理 vs 不合理,而不是短 vs 长,这对我来说没有意义,因为它们是完全不同的建议而不是不同的措辞同样的建议。我还伴随着轻微的格式/安排变化——所有这些变化都纯粹是为了反映我对这个答案如何看起来更好的看法。当然,您不必同意我的任何更改,如果您决定回滚它们,我会非常高兴,干杯。 (3认同)