我正在使用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),
让我感到困惑的是我如何实现对一个属性的检查,如果这有意义则检查另一个属性?
我想知道这是否真的可行?或者如果我以错误的方式接近它。
非常感谢任何帮助,谢谢您的时间。
答案 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
)
)