SQL约束/触发器-是否可以编写一个约束来检查“插入记录时,它必须包含两个字段之一”?

SQL约束/触发器-是否可以编写一个约束来检查“插入记录时,它必须包含两个字段之一”?,sql,triggers,constraints,Sql,Triggers,Constraints,是否可以在输入的记录上设置约束/触发器,以检查用户是否输入了三个字段中的至少一个,所有字段都可以为空。例如,我有一个数据库,用于跟踪其他软件中的错误和新功能。当发现一个bug时,会创建一个功能记录,其中可能有三个外键:discoveredID、fixedID或newFeatureID,这三个外键都可以为null,因为它可能是一个已发现bug、修复bug或添加到软件中的新功能。但用户在输入数据时必须至少选择一个。我可以使用我的数据库控制外部程序中的输入,但如果其他人编写程序,他们可能不会执行该检查

是否可以在输入的记录上设置约束/触发器,以检查用户是否输入了三个字段中的至少一个,所有字段都可以为空。例如,我有一个数据库,用于跟踪其他软件中的错误和新功能。当发现一个bug时,会创建一个功能记录,其中可能有三个外键:discoveredID、fixedID或newFeatureID,这三个外键都可以为null,因为它可能是一个已发现bug、修复bug或添加到软件中的新功能。但用户在输入数据时必须至少选择一个。我可以使用我的数据库控制外部程序中的输入,但如果其他人编写程序,他们可能不会执行该检查,因此我希望阻止他们这样做并输入损坏的数据。

使用SQL Server,添加一个即可

CREATE TABLE Bugs (
  discoveredID INTEGER
  , fixedID INTEGER 
  , newFeatureID INTEGER  
  )

ALTER TABLE Bugs ADD CONSTRAINT CKC_AtLeastOne CHECK (COALESCE(discoveredID, fixedID, newFeatureID) IS NOT NULL)

INSERT INTO Bugs VALUES (NULL, NULL, 1)
INSERT INTO Bugs VALUES (NULL, 1, NULL)
INSERT INTO Bugs VALUES (1, NULL, NULL)
INSERT INTO Bugs VALUES (NULL, NULL, NULL) -- Fails

DROP TABLE Bugs

阅读您的设计让我想到,问题可能更多地出现在表设计中,而不是创建约束/触发器的要求

例如,您提到您可以有3种类型的bug发现bug、修复bug或新特性

是否可能有一个由两个字段组成的组合键,这两个字段都是bug类型,旁边是assocaited ID字段

因此,不是: 发现ID、修复ID、新功能ID

你只要: bugTypeID,BugID


通过此更改,您可以将注意力集中在bugTypeID为1、2或3。

+1。仔细想想,通过正确地建模数据模型,不需要检查约束。此外,添加一个新类型的bug也很容易。规范说用户在输入数据时必须至少选择一个。建议的超规范化表设计解决了用户必须只选择一个表的情况。这个建议可能是对的,也可能不是。。。答案并没有解决实际提出的问题。。。在我看来,这是相当不礼貌的:你是对的,尽管我对设计做了一些调整,我仍然需要解决方案,但在我新设计的其他地方。我想我可以在我的设计中消除对它的需求,但不幸的是,考虑到时间限制,这是一种可用的设计。不过,我会在将来对其进行审查,并牢记您的观点。谢谢你的贡献。@Breck-这并不是不礼貌的,我希望OP不会这么看。它确实避开了OP问题,但我觉得这是值得一提的,因此他可以考虑另一个解决他的问题的方法,这个设计很好地适合于想要增加bug类型的NUP而不需要GUI /数据库设计,因为他所要做的是为bug ID创建一个描述表中的附加条目。我相信这个解决方案确实回答了这个问题,因为它首先消除了对触发器的需求。感谢您的快速响应,这正是我所需要的!为编辑们干杯,有人在我的comp上添加了一个自动更正来约束containt,哈哈。