Null上的条件空约束

时间:2015-06-08 14:28:45

标签: sql-server tsql

我有以下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但从不只有其中一个约束Name。因此,当Slugnull不是null时,另一个也必须不是recaptcha_secret = "example45454sasa" sendstring = _ "https://www.google.com/recaptcha/api/siteverify?" & _ "secret=" & recaptcha_secret & _ "&response=" & request.form("g-recaptcha-response") Set objXML = Server.CreateObject("MSXML2.ServerXMLHTTP") objXML.Open "GET", sendstring , false objXML.Send() if instr(objXML.responseText,"true") then response.write "yes" else response.write "no" end if

2 个答案:

答案 0 :(得分:4)

您的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)
);

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

答案 1 :(得分:0)

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

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