创建带有支票的表格

时间:2015-03-03 23:36:52

标签: sql sql-server

我正在使用Microsoft SQL数据库管理器,我正在创建一些表,并且已经遇到了问题;

我正在尝试创建一个有两个外键的表; 的EmpID MEMBERID

这两个都可以为null,但实际上,要么是null,要么在输入数据时不会在给定时间,(XOR逻辑);

如果EmpID不为null,那么MemberID将是(输入数据时)。

我有一个名为IsEmp的布尔属性(表示为BIT) 我正在尝试创建一个检查,看看是否;

如果EmpID为NULL,则isEmp = 0,否则isEmp = 1,所以当我输入数据时,我不必担心这一点,它会自动执行。下面是我输入的查询,我认为它可以工作,但给了我一个错误;

CREATE TABLE CustomerDetails (
DetailID    int IDENTITY(100,1) PRIMARY KEY,
EmpID       int FOREIGN KEY REFERENCES Employee(EmpID),
MemberID    int FOREIGN KEY REFERENCES ProntoClub(MemberID),
IsEmp       BIT NOT NULL CHECK (EmpID > 0),
FLineAdd    VarChar(20) NOT NULL,
SLineAdd    VarChar(20) NOT NULL,
Town        VarChar(20) NOT NULL,
PostCode    VarChar(8) NOT NULL,
ContactNo   Char(11),
EMail       VarChar(35),
DoB         DATE NOT NULL

我在谷歌周围做了一些窥探以找到答案,但我遇到的问题是人们的例子是例如;

IsEmp       BIT NOT NULL CHECK (IsEMP > 0),

让我感到困惑的是我如何实现对一个属性的检查,如果这有意义则检查另一个属性?

我想知道这是否真的可行?或者如果我以错误的方式接近它。

非常感谢任何帮助,谢谢您的时间。

2 个答案:

答案 0 :(得分:0)

试试这个:

IsEmp BIT NOT NULL CHECK((IsEMP> 0和EmpID IS not NULL)或(IsEMP = 0且EmpID为NULL))

答案 1 :(得分:0)

IsEmp应该是一个计算列

IsEmp as case when EmpID > 0 then 1 else 0 end

需要在表级别定义跨越列的检查约束。

create table CustomerDetails (
    -- ... cols ...
    constraint ck_name check (
      EmpID + MemberID is null
      and coalesce(EmpID, MemberID) is not null
    )
)