首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于FK关系的约束

基于FK关系的约束
EN

Stack Overflow用户
提问于 2015-10-13 23:57:07
回答 1查看 45关注 0票数 1

具有重要字段的两个表的结构:

代码语言:javascript
复制
TableA: Id (PK), Type
TableB: Id (PK), TableAId (FK), ReferenceId (Self-reference key)

我需要有一个约束,即:

只有当TableB ReferenceId值指向类型值> 1的记录时,TableAId列才能也必须包含值。

我该怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-14 03:19:52

一种不需要触发器的方法具有数据冗余。

type列放在TableB中,并在那里加上一个约束。并为外键向TableA添加一个额外的唯一键:

代码语言:javascript
复制
create table tableA (
    id int primary key,
    type int,
    constraint unq_type_id unique (type, id)
);

create table tableB (
    id int primary key,
    type int,
    tableAID int,
    constraint fk_tableB_type_tableAID foreign key (type, tableAID) references tableA(type, id),
    constraint chk_type check (type > 1)
);

这是一个黑客,但它确实完成了你想要的没有触发器。

此方法的更改不需要在两个表中重复type,但它确实需要额外的列:

代码语言:javascript
复制
create table tableA (
    id int primary key,
    type int,
    typeIsValid as (case when type > 1 then 1 else 0 end) persisted,
    constraint unq_type_id unique (typeIsValid, id)
);

create table tableB (
    id int primary key,
    tableAID int,
    typeIsValid as (1),
    constraint fk_tableB_typeIsValid_tableAID foreign key (typeIsValid, tableAID) references tableA(type, id) persisted
);

这甚至适用于SQL Fiddle

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33114506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档