我有以下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
)
如何创建一个约束,允许Name
和Slug
同时为null
但从不只有其中一个约束Name
。因此,当Slug
或null
不是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
。
答案 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)
您需要查看检查约束。请参阅以下文档