可以使用索引来强制执行此业务规则吗?

时间:2019-02-05 19:43:58

标签: sql-server tsql

请考虑下表:

my_proj/provisioner/host_vars/all.yml

尝试插入(3,'Name2')将会失败,因为具有相同Name值的行应始终具有相同的ID值。

这可以通过索引强制执行吗?我知道可以通过触发器或约束来强制执行此操作,但是这两种方法似乎都不太合适。

请注意,这个问题源自真实的(更复杂的)业务逻辑,为了简化起见,我简化为该示例。

2 个答案:

答案 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强制执行。