2015-06-08 2 views
0

У меня есть следующие таблицы: SQLУсловное нулевое ограничение на Null

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.

+0

в основном устанавливает ограничение на '(имя равно null) xor (slug is null)': http://stackoverflow.com/questions/5411619/t-sql-xor-operator –

+0

Вы уверены, что MS SQL Server поддерживает xor ? Я пытался и, похоже, не поддерживал его. –

+0

Вот почему я связался с тем, как делать xor ... –

ответ

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

EDIT

(Мой комментарий был слишком долго ...)

Я не думаю, что есть более короткий путь, и даже если бы это было только синтаксический сахар, логически была бы выполнена одна и та же проверка.

Если реальный пример намного больше столбцов, и вы действительно беспокоитесь о стоимости проверки всех столбцов, а затем создать таблицу расширений, что-то вроде:

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

Так как столбцы в таблице расширения не являются нулевыми, они должны либо быть не равными нулю, либо вообще не быть записью, например все столбцы будут пустыми.

+0

Да, именно это я и использовал ... Я не был уверен, был ли самый короткий вариант. –

0

Вам нужно взглянуть на контрольные ограничения. Пожалуйста, смотрите документацию ниже

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

+0

Да, я делал ограничение проверки ... Но как это сделать с помощью проверки constaint? Обычно я использую его, чтобы ограничить столбец определенными значениями, а не нулем с другим столбцом –

Смежные вопросы