我应该如何在Sql Server中执行此操作(业务逻辑)?约束?

时间:2010-04-19 05:08:06

标签: tsql database-design sql-server-2008 constraints unique

我希望向表中添加某种类型的业务逻辑约束,但不确定如何/在哪里。

我有一个包含以下字段的表格。

  • ID INTEGER IDENTITY
  • HubId INTEGER
  • CategoryId INTEGER
  • IsFeatured BIT
  • Foo NVARCHAR(200)

所以我希望你的每个hubId + categoryId只能有一个特色东西。

eg.
1, 1, 1, 1, 'blah'  -- Ok.
2, 1, 2, 1, 'more blah' -- Also Ok
3, 1, 1, 1, 'aaa' -- constraint error
4, 1, 1, 0, 'asdasdad' -- Ok.
5, 1, 1, 0, 'bbbb' -- Ok.

etc.

因此要插入的第三行将失败,因为该集线器AND类别已经具有特色功能。

这可能吗?

1 个答案:

答案 0 :(得分:3)

您使用数据库约束来保护数据。对我来说,业务逻辑是计算或复杂逻辑或逐行处理:不是唯一约束的味道

在这种情况下:

  1. 您可以在插入后使用触发器进行检查
  2. 在HubId,CategoryId,IsFeatured上定义过滤IsFeatured = 1的索引视图
  3. 使用filtered index,因为您有SQL Server 2008(类似于索引视图)
  4. 我会亲自前往选项3

    PS:你提到的articleID在哪里?

    这个问题是:Combining the UNIQUE and CHECK constraints

    编辑:

    基本上,你要做

    CREATE UNIQUE INDEX IX_Foo ON Mytable (HubId, CategoryId) WHERE IsFeatured = 1
    

    因此,对于IsFeatured = 1

    的数据子集,现在检查(HubId,CategoryId) 的唯一性