1

我有两张桌子:

create table [Customer]
(
    [Id] int primary key identity not null,
    [Type] int not null check([Type >= 0 and [Type] <= 2)
    -- other columns
)
create table [Partial Record]
(
    [Id] int primary key identity not null,
    [Student Id] int references [Customer]([Id])
)

我之所以调用 [Student Id],是因为 Customer 表具有继承性,问题是:我想添加一个检查[Partial Record]以确保关联具有仅属于学生的"[Type] = 1"for 。[Partial Record]

是否可以?

4

3 回答 3

1

您可以通过向Customer表中添加超级键并添加强制外键来做到这一点:

create table [Customer]
(
    [Id] int primary key identity not null,
    [Type] int not null check([Type] >= 0 and [Type] <= 2)
    ,constraint UQ_Customer_TypeCheck UNIQUE (ID,Type)
)
create table [Partial Record]
(
    [Id] int primary key identity not null,
    [Student Id] int references [Customer]([Id]),
    Type as 1 persisted,
    constraint FK_Partial_TypeCheck FOREIGN KEY ([Student Id],Type) references Customer (ID,Type)
)

(如果每个学生应该只有一行,我可能会删除Id-只需制作主键)[Partial Record][Student Id]

于 2012-10-09T06:38:15.670 回答
0

我只能考虑使用触发器来执行此操作,例如:SQL Server: halt an INSERT in a trigger。可能不会很有效率或性能,但应该做你想做的事。

于 2012-10-05T21:40:50.243 回答
0

this answer(和this one)中描述的类似问题,您可以创建一个用户定义函数来检查另一个表中的值,然后编写一个约束来调用该函数。

但正如其他人评论的那样,如果可以的话,我会考虑改变你的桌子。不同的设计将消除对该type字段的需求。

于 2012-10-09T06:24:04.327 回答