当前位置: 首页 > 面试题库 >

我如何有一个引用另一个表的检查约束?

贺恩
2023-03-14
问题内容

我在SQL Server 2008数据库中具有以下表:

  • tblItem ,它具有一个 ItemID 字段;

  • tblGoodItem ,它也有一个ItemID字段,并且有一个指向tblItem的外键;

  • tblBadItem ,它也具有ItemID字段,并且还具有指向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,
  ItemType CHAR(1),
  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) REFERENCES tblItem(ItemID, ItemType) 
);

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

但是,将项目从好更改为坏的过程分为三个步骤:

  1. 从tblGoodItem删除行
  2. 在tblItem中更新行的ItemType
  3. 在tblBadItem中插入行


 类似资料:
  • 我有两个表两个表名

  • 问题内容: 我有两个清单说 现在,我想找出List2中是否存在List1的所有元素。在这种情况下,就全部存在。我不能使用子集函数,因为我可以在列表中重复元素。我可以使用for循环来计算List1中每个项目的出现次数,并查看它是否小于或等于List2中的出现次数。有一个更好的方法吗? 谢谢。 问题答案: 当出现次数无关紧要时,您仍可以通过动态创建集合来使用子集功能: 如果需要检查每个元素在第二个列表

  • 我有一个活动选项卡的自动播放选项卡类current,这意味着当选项卡是活动的时,列表项有一个名为current的类。 现在我要向第一个子 添加不同的类 null null

  • 问题内容: 我正在尝试比较两个列表,如果第二个列表中有第一个列表中的任何值,则只打印一条消息。 在此示例中,我要对进行求值,因为两个列表中都包含5。这行不通,而且我不确定比较这两个列表的最简单方法。 问题答案: 您可以用很多方法解决。一个很容易理解的方法就是只使用一个循环。 一个更紧凑的方法是使用和: 更好的是,可以将其替换为: 您还可以使用集合:

  • 问题内容: 在我的PostgreSQL 9.4 数据库中,我有一个表,该表的列具有唯一值。 我正在创建具有相似结构(此处不重要)和一列的新表。我需要一种方法来限制要插入的值,使其不存在于中。 例如,如果包含值 ‘color’ 和 ‘length’ ,则需要防止包含 ‘color’ 或 ‘length’ 值。因此,换句话说,我需要提供两个表中的列之间没有任何重复的值。约束应该是双向的。 问题答案:

  • 问题内容: 我有一条语句需要写(用通用名称表示,因为这是为了工作)来更新表“ tUpd”中的列“ updCol”。tUpd还具有一个列“ linkCol”,该列存在于另一个表tOther中。tOther还有另一列“ idCol”。 我的问题是更新tUpd中行的updCol值,该值通过linkCol对应于具有给定idCol值的行。 我认为应该起作用的一种解决方案是: 但是,我担心这种方法会导致性能下