Как создать уникальное ограничение, которое также допускает нулевые значения?

Атрибут [DisplayFormat] используется только в EditorFor / DisplayFor, а не в необработанных HTML-API, таких как TextBoxFor. Я получил это, выполнив следующие действия:

Model:

[Display(Name = "When was that document issued ?")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
public DateTime? LiquorLicenceDocumentIssueDate { get; set; }

Вид:

        
@Html.LabelFor(m => m.LiquorLicenceDocumentIssueDate) @Html.EditorFor(m => m.LiquorLicenceDocumentIssueDate)
@Html.ValidationMessageFor(m => m.LiquorLicenceDocumentIssueDate)

Выход: 30/12/2011

Ссылки по теме:

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.displayformatattribute.applyformatineditmode.aspx

569
задан Jeroen 20 October 2014 в 11:40
поделиться

5 ответов

SQL Server 2008 +

Вы может создать уникальный индекс, который принимает несколько значений NULL с предложением WHERE . См. Ответ ниже .

До SQL Server 2008

Невозможно создать ограничение UNIQUE и разрешить значения NULL. Вам нужно установить значение по умолчанию NEWID ().

Обновите существующие значения до NEWID (), где NULL, перед созданием ограничения UNIQUE.

140
ответ дан 22 November 2019 в 22:07
поделиться

То, что вы ищете, действительно является частью стандартов ANSI SQL: 92, SQL: 1999 и SQL: 2003 т.е. ограничение UNIQUE должно запрещать дублирование значений, отличных от NULL, но принимать несколько значений NULL.

В мире Microsoft SQL Server, однако, допускается один NULL, но нельзя использовать несколько NULL ...

В SQL Server 2008 вы можете определить уникальный фильтрованный индекс на основе предиката. исключая NULL:

CREATE UNIQUE NONCLUSTERED INDEX idx_yourcolumn_notnull
ON YourTable(yourcolumn)
WHERE yourcolumn IS NOT NULL;

В более ранних версиях вы можете прибегнуть к VIEWS с предикатом NOT NULL, чтобы применить ограничение.

1243
ответ дан 22 November 2019 в 22:07
поделиться

Создайте представление, которое выбирает только столбцы, отличные от NULL , и создайте УНИКАЛЬНЫЙ ИНДЕКС в представлении:

CREATE VIEW myview
AS
SELECT  *
FROM    mytable
WHERE   mycolumn IS NOT NULL

CREATE UNIQUE INDEX ux_myview_mycolumn ON myview (mycolumn)

Обратите внимание, что вам нужно выполнить INSERT и UPDATE в представлении вместо таблицы.

Вы можете сделать это с триггером INSTEAD OF :

CREATE TRIGGER trg_mytable_insert ON mytable
INSTEAD OF INSERT
AS
BEGIN
        INSERT
        INTO    myview
        SELECT  *
        FROM    inserted
END
6
ответ дан 22 November 2019 в 22:07
поделиться

Можно создать уникальное ограничение для кластеризованного индексированного представления

Вы можете создать представление следующим образом:

CREATE VIEW dbo.VIEW_OfYourTable WITH SCHEMABINDING AS
SELECT YourUniqueColumnWithNullValues FROM dbo.YourTable
WHERE YourUniqueColumnWithNullValues IS NOT NULL;

и уникальное ограничение, подобное этому:

CREATE UNIQUE CLUSTERED INDEX UIX_VIEW_OFYOURTABLE 
  ON dbo.VIEW_OfYourTable(YourUniqueColumnWithNullValues)
4
ответ дан 22 November 2019 в 22:07
поделиться

Возможно, рассмотрите триггер « INSTEAD OF » и выполните проверку самостоятельно? С некластеризованным (неуникальным) индексом для столбца для включения поиска.

2
ответ дан 22 November 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: