【问题标题】:Conditional null constraint on NullNull 的条件空约束
【发布时间】:2015-08-23 01:56:46
【问题描述】:

我有以下SQL 表:

create table dbo.[File]
(
  Id int identity not null
    constraint PK_File_Id primary key clustered (Id),
  MimeType nvarchar (400) not null,
  Name nvarchar (80) null,
  Slug nvarchar (80) null
)

如何创建一个约束,允许 NameSlug 既是 null 又不能只是其中一个。所以当NameSlug不是null时,另一个也一定不是null

【问题讨论】:

标签: sql-server tsql


【解决方案1】:

您需要查看检查约束。请参阅下面的文档

https://msdn.microsoft.com/en-US/library/ms187550.aspx

【讨论】:

  • 是的,我正在做一个检查约束......但是如何使用检查约束来做到这一点?通常我用它来将一列限制为某些值,而不是另一列的空值
【解决方案2】:

您的check constraint 将是这样的:

ALTER TABLE dbo.[File] 
    ADD CONSTRAINT CHK_File__Name_Slug 
    CHECK ((Slug IS NULL AND Name IS NULL) OR (Name IS NOT NULL AND Slug IS NOT NULL));

-- TESTS
INSERT dbo.[File] (MimeType, Name, Slug) VALUES ('X', NULL, 'X'); -- FAIL 
INSERT dbo.[File] (MimeType, Name, Slug) VALUES ('X', 'X', 'X');
INSERT dbo.[File] (MimeType, Name, Slug) VALUES ('X', 'X', NULL); -- FAIL 
INSERT dbo.[File] (MimeType, Name, Slug) VALUES ('X', NULL, NULL);

编辑

(我的评论太长了……)

我认为没有更短的方法,即使只有语法糖,逻辑上也会执行相同的检查。

如果实际示例是更多列,并且您真的担心检查所有列的成本,那么创建一个扩展表,例如:

CREATE TABLE dbo.[FileExendedProperties] 
(
        FileID INT NOT NULL,
        Name NVARCHAR (80) NOT NULL,
        Slug NVARCHAR (80) NOT NULL,
    CONSTRAINT PK_FileExendedProperties__FileID PRIMARY KEY (FileID),
    CONSTRAINT FK_FileExendedProperties__FileID FOREIGN KEY (FileID) 
        REFERENCES dbo.[File] (FileID)
);

由于扩展表中的列不可为空,因此它们必须全部不为空,或者其中根本没有记录,例如所有列都将为空。

【讨论】:

  • 是的,这就是我最终使用的……我不确定是否有最短的选择。
猜你喜欢
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多