Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 contraint Unique or Null  [new]
tunknown
Member

Откуда:
Сообщений: 759
Нужен constraint- поле не заполнено или уникально, в т.ч. в пределах другого поля. Таблица только для примера, реальности не отражает.
create	table	dbo.Tree
(	Id		int	identity ( 1,	1 )	primary	key
	,Parent		int	references	dbo.Tree ( Id )
	,Name		varchar ( 256 )
	,Sequence	int	null )

Два декларативных варианта, как сделать:
  • Вариант 1
    alter	table	dbo.Tree	add
    	UQorNull	as	isnull ( Sequence,	Id )	persisted	not	null
    ,unique	( Parent,	UQorNull )
    

  • Вариант 2
    create	view	dbo.TreeUQorNull
    WITH	SCHEMABINDING
    as
    select
    	Parent
    	,UQorNull=	isnull ( Sequence,	Id )
    from
    	dbo.Tree
    go
    create	unique	clustered	index	IXdboTreeUQorNull	on	dbo.TreeUQorNull	( Parent,	UQorNull )
    

  • Проверка
    insert	dbo.Tree	( Parent,	Name,	Sequence )
    select			null,		'a',	null
    
    declare	@id	int=	scope_identity()
    
    insert	dbo.Tree	( Parent,	Name,	Sequence )
    		select	@id,		'b',	null
    union	all	select	@id,		'c',	null
    union	all	select	@id,		'd',	1
    --union	all	select	@id,		'e',	1
    
    select	*	from	dbo.Tree
    

    Какой вариант при эксплуатации имеет большие накладные расходы? Материализация и там и там место на диске тратит.
  • 23 май 18, 11:09    [21431445]     Ответить | Цитировать Сообщить модератору
     Re: contraint Unique or Null  [new]
    TaPaK
    Member

    Откуда: Kiev
    Сообщений: 6801
    tunknown,

    я бы дальше первого варианта никогда и не подумал так извращаться. Ну и накладные на 2 будут точно больше
    23 май 18, 11:17    [21431492]     Ответить | Цитировать Сообщить модератору
     Re: contraint Unique or Null  [new]
    invm
    Member

    Откуда: Москва
    Сообщений: 9300
    tunknown,

    Обязательно constraint? Фильтрованный уникальный индекс не подойдет?

    ЗЫ: UQorNull можно и не делать persisted.
    23 май 18, 11:25    [21431542]     Ответить | Цитировать Сообщить модератору
     Re: contraint Unique or Null  [new]
    TaPaK
    Member

    Откуда: Kiev
    Сообщений: 6801
    invm,

    так он и так получил уникальный некластерный. А фильтровать там что? NOT NULL? так имхо у него это требование
    23 май 18, 11:28    [21431558]     Ответить | Цитировать Сообщить модератору
     Re: contraint Unique or Null  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 46975
    CREATE UNIQUE INDEX uiSequence ON dbo.Tree(Sequence) WHERE Sequence IS NOT NULL;
    
    23 май 18, 11:41    [21431635]     Ответить | Цитировать Сообщить модератору
     Re: contraint Unique or Null  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 46975
    Sequence - ключевое слово. Лучше не надо поле так называть.
    23 май 18, 11:42    [21431642]     Ответить | Цитировать Сообщить модератору
     Re: contraint Unique or Null  [new]
    TaPaK
    Member

    Откуда: Kiev
    Сообщений: 6801
    iap,

    ну и Parent если пишет "в пределах другого поля"
    23 май 18, 11:46    [21431668]     Ответить | Цитировать Сообщить модератору
     Re: contraint Unique or Null  [new]
    invm
    Member

    Откуда: Москва
    Сообщений: 9300
    TaPaK,

    Ему нужна уникальность (Parent, Sequence) без учета строк с null в Sequence.
    23 май 18, 11:58    [21431719]     Ответить | Цитировать Сообщить модератору
     Re: contraint Unique or Null  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 46975
    invm
    TaPaK,

    Ему нужна уникальность (Parent, Sequence) без учета строк с null в Sequence.
    Вообще-то, и в Parent несколько NULL не помешает иногда иметь. Если допустимы несколько корней, например.
    23 май 18, 12:02    [21431730]     Ответить | Цитировать Сообщить модератору
     Re: contraint Unique or Null  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 46975
    iap
    invm
    TaPaK,

    Ему нужна уникальность (Parent, Sequence) без учета строк с null в Sequence.
    Вообще-то, и в Parent несколько NULL не помешает иногда иметь. Если допустимы несколько корней, например.
    Можно, конечно, определить корень как Parent=Id.
    Но мне кажется, Parent IS NULL как-то красивее смотрится.
    23 май 18, 12:04    [21431742]     Ответить | Цитировать Сообщить модератору
     Re: contraint Unique or Null  [new]
    TaPaK
    Member

    Откуда: Kiev
    Сообщений: 6801
    iap
    iap
    пропущено...
    Вообще-то, и в Parent несколько NULL не помешает иногда иметь. Если допустимы несколько корней, например.
    Можно, конечно, определить корень как Parent=Id.
    Но мне кажется, Parent IS NULL как-то красивее смотрится.

    ну практически всегда мы 0 делаем, или же как вы пишете Parent=Id(но это чаще для внутренней обработки меняя 0). Null же вообще развалит уникальность
    23 май 18, 12:06    [21431748]     Ответить | Цитировать Сообщить модератору
     Re: contraint Unique or Null  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 46975
    TaPaK
    iap
    пропущено...
    Можно, конечно, определить корень как Parent=Id.
    Но мне кажется, Parent IS NULL как-то красивее смотрится.

    ну практически всегда мы 0 делаем, или же как вы пишете Parent=Id(но это чаще для внутренней обработки меняя 0). Null же вообще развалит уникальность
    Если Id - IDENTITY, а Parent - NOT NULL, то Parent=Id обеспечить не так-то и просто.
    23 май 18, 15:27    [21432852]     Ответить | Цитировать Сообщить модератору
     Re: contraint Unique or Null  [new]
    Владислав Колосов
    Member

    Откуда:
    Сообщений: 7687
    invm
    tunknown,

    Обязательно constraint? Фильтрованный уникальный индекс не подойдет?

    ЗЫ: UQorNull можно и не делать persisted.


    Фильтрованный уникальный вполне работает в таких случаях.
    23 май 18, 16:58    [21433273]     Ответить | Цитировать Сообщить модератору
     Re: contraint Unique or Null  [new]
    tunknown
    Member

    Откуда:
    Сообщений: 759
    invm
    Обязательно constraint? Фильтрованный уникальный индекс не подойдет?
    Спасибо. Узнал новую для себя возможность. Прямо хоть whats new перечитывай:-(
    23 май 18, 17:38    [21433438]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить