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)