加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 如何使用引用另一个表的检查约束?

发布时间:2020-12-12 06:49:28 所属栏目:MsSql教程 来源:网络整理
导读:我在SQL Server 2008 db中有以下表: tblItem,它有一个ItemID字段; tblGoodItem,它还有一个ItemID字段,并且有一个指向tblItem的外键; tblBadItem,并且还有一个指向tblItem的外键. 物品既不是好物品,也不是坏物品;它必须是一个或另一个.但是,无论项目是好还是
我在SQL Server 2008 db中有以下表:

> tblItem,它有一个ItemID字段;
> tblGoodItem,它还有一个ItemID字段,并且有一个指向tblItem的外键;
> tblBadItem,并且还有一个指向tblItem的外键.

物品既不是好物品,也不是坏物品;它必须是一个或另一个.但是,无论项目是好还是坏,它都必须是一个项目.

我的问题是:如何在tblGoodItem和tblBadItem中的ItemID字段中添加约束,以便两个表中都不能存在ItemID值?

我已经阅读了类似问题的Stack Overflow中的一些回复,我正在考虑这个解决方案:

>创建一个视图vwItem,它在ItemID上的tblBadItem上连接tblGoodItem.
>编写一个UDF fnItem,它对vwItem执行查询以查看视图中存在多少条记录.
>有一个调用fnItem的约束并验证返回的值是否为0.

这是最好的主意吗?有没有人有更好的主意?

解决方法

添加列tblItem.ItemType列.此列在任何给定行上只能有一个值(显然).在ItemID,ItemType上添加唯一约束.

现在的诀窍:很少有人记住这一点,但外键可以引用唯一约束的列.

CREATE TABLE tblItem (
  ItemID INT PRIMARY KEY,ItemType CHAR(1),UNIQUE KEY (ItemID,ItemType)
);

CREATE TABLE tblGoodItem (
  ItemID INT PRIMARY KEY,CHECK (ItemType='G')
  FOREIGN KEY (ItemID,ItemType) REFERENCES tblItem(ItemID,ItemType) 
);

CREATE TABLE tblBadItem (
  ItemID INT PRIMARY KEY
  ItemType CHAR(1),CHECK (ItemType='B')
  FOREIGN KEY (ItemID,ItemType) 
);

如果将每个子表中的ItemType约束为固定值,则tblItem中的给定行只能由一个子表引用.

这是一个将项目从好变为坏的三个步骤:

>从tblGoodItem删除行>在tblItem中更新行的ItemType>在tblBadItem中插入行

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读