请考虑下表:
my_proj/provisioner/host_vars/all.yml
尝试插入(3,'Name2')将会失败,因为具有相同Name值的行应始终具有相同的ID值。
这可以通过索引强制执行吗?我知道可以通过触发器或约束来强制执行此操作,但是这两种方法似乎都不太合适。
请注意,这个问题源自真实的(更复杂的)业务逻辑,为了简化起见,我简化为该示例。
答案 0 :(得分:3)
是的,可以通过索引来强制执行。
虽然不是基表上的索引。您可以在ID, Name
上选择并分组来创建视图。
然后使用键列Name
CREATE TABLE dbo.YourTable
(
ID INT,
Name VARCHAR(10)
);
GO
CREATE VIEW dbo.SomeView
WITH SCHEMABINDING
AS
SELECT count_big(*) AS c,
ID,
Name
FROM dbo.YourTable
GROUP BY ID,
Name
GO
CREATE UNIQUE CLUSTERED INDEX SomeIndex
ON dbo.SomeView(Name)
GO
---SUCCEEDS
INSERT INTO dbo.YourTable
VALUES (1,'Name1'),
(1, 'Name1'),
(1, 'Name1'),
(2, 'Name2'),
(2, 'Name2');
GO
---FAILS
INSERT INTO dbo.YourTable
VALUES (3,
'Name2');
答案 1 :(得分:-1)
否,不能使用索引(在基表上)强制执行它。
可以使用调用UDF的CHECK约束来强制实施。
也可以使用TRIGGER强制执行。