sql-server - 检查约束 – 仅当另一列为 true 时才允许一列为 true

标签 sql-server tsql sql-server-2008-r2 constraints check-constraints

采用以下示例表:

CREATE TABLE [dbo].[tbl_Example](
    [PageID] [int] IDENTITY(1,1) NOT NULL,
    [RequireLogin] [bit] NOT NULL,
    [RequireAdmin] [bit] NOT NULL,
    [HideIfLoggedIn] [bit] NOT NULL
)

如何重写上述内容以包含检查约束,如下所示:

  • 如果 [RequireLogin]False,则强制 [RequireAdmin]False(即仅允许 如果[RequireLogin]True,同时允许[RequireLogin],则[RequireAdmin]TrueTrue[RequireAdmin]False
  • 仅当 [RequireLogin]False 时才允许 [HideIfLoggedIn]True

最佳答案

您通常会在检查中执行嵌套的 case 语句,以使该类型的逻辑发挥作用。请记住,检查中的案例仍然必须是评估,因此它将采用以下形式

CHECK (case when <exp> then 1 end = 1).

查看您的具体要求,但是这似乎也可行并且可能更易于阅读:

 CREATE TABLE [dbo].[tbl_Example]
 (
    [PageID] [int] IDENTITY(1,1) NOT NULL,
    [RequireLogin] [bit] NOT NULL,
    [RequireAdmin] [bit] NOT NULL,
    [HideIfLoggedIn] [bit] NOT NULL
 )

 ALTER TABLE [dbo].[tbl_Example] ADD CONSTRAINT
     [RequireAdmin] CHECK 
      ((RequireAdmin = RequireLogin) OR 
      (RequireLogin=1));

 ALTER TABLE [dbo].[tbl_Example] ADD CONSTRAINT
      [HideIfLoggedIn] CHECK 
      ((RequireLogin=1 AND HideIfLoggedIn=0) OR 
       (RequireLogin=0 AND HideIfLoggedIn=1) OR 
       (RequireLogin=0 AND HideIfLoggedIn=0))

关于sql-server - 检查约束 – 仅当另一列为 true 时才允许一列为 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15329103/

相关文章:

sql - 运行总计列的复杂 SQL 查询

sql-server - SQL Server树状结构数据查询

sql - 如何创建由其他列分段的自动增量列

sql-server - SQL Server R2 企业版下载?

sql-server - 重用具有不同参数值的 SQL Server 游标?

sql-server - 建模资源所有权的最佳方式

sql-server - group by xml in for xml 子句

包含嵌套元素的 SQL 表中的 XML

sql - 如何安全地将 varchar(255) 转换为 int?

sql - 当您执行 `SELECT *` 时,SQL Server 如何确定列的顺序?