sql - SQL 数据库中的约束

标签 sql sql-server-2005 tsql check-constraints

我需要在 T-SQL 中有一个具有以下结构的表

KEY     Various_Columns       Flag
 1          row 1              F
 2          row_2              F
 3          row_3              T
 4          row_4              F

要么没有行,要么最多一行可以有值为 T 的标志列。我的开发人员声称这可以通过在表上放置一个检查约束来实现。

问题:

  1. 是否可以在数据库级别将这样的约束放在数据库本身(即行间约束)上,而不是放在更新或插入行的业务规则中
  2. 这样的表是正规形式吗?
  3. 或者正常形式是否需要删除 Flag 列,而是(比如说)有另一个简单的表或变量包含 Flag=T 的行的值,即在上述情况下 row=3。

最佳答案

1 否。检查约束是每行。也没有其他约束会这样做。

您需要以下之一:

  • 触发器(所有版本)
  • 带过滤器 Flag = T 的索引 View ,以及 Flag 上的唯一索引(SQL Server 2000+)
  • 过滤索引(SQL Server 2008)

2 足够好

3 真的矫枉过正。您正在拆分相同的数据以避免上述解决方案之一。但是使用单行表,ID 列的 FK,以及 Flag 的唯一约束

关于sql - SQL 数据库中的约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3876236/

相关文章:

sql-server-2005 - 在sql server中保存代码片段

sql - 在 JOIN 条件下使用 RTRIM

sql - 需要 MDX 查询总计数

sql - 通过连接和计数对多列进行排序

MySQL - 根据日期获取预订信息

php - 在此 foreach 循环中设置 PHP 变量

sql-server - SQL 查询 - 返回两个日期之间的所有秒数

sql-server-2008 - 用于标签的 GUID 与身份

sql - Oracle 12c - 我们可以在将数据插入表而不是整个表时锁定分区吗?

mysql - 在 SQL 函数内运行 SELECT 语句