检查约束 - 如果另一列为真,则仅允许一列为真

Hea*_*ore 6 t-sql sql-server constraints check-constraints sql-server-2008-r2

采用以下示例表:

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

如何重写上面的内容以包括检查约束,如下所示:

  • 部队[RequireAdmin],如果[RequireLogin](即只允许[RequireAdmin],如果[RequireLogin]真实的,同时允许[RequireLogin],并[RequireAdmin]
  • 如果为False,则仅允许[HideIfLoggedIn]True[RequireLogin]

RTh*_*mas 9

您通常在检查中执行嵌套的case语句,以使该类型的逻辑起作用.请记住,支票中的案例仍然必须是评估,因此需要采用该格式

CHECK (case when <exp> then 1 end = 1).
Run Code Online (Sandbox Code Playgroud)

查看您的确切要求,但似乎这也可以工作,可能更容易阅读:

 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))
Run Code Online (Sandbox Code Playgroud)