powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / contraint Unique or Null
14 сообщений из 14, страница 1 из 1
contraint Unique or Null
    #39648517
tunknown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужен constraint- поле не заполнено или уникально, в т.ч. в пределах другого поля. Таблица только для примера, реальности не отражает.
Код: sql
1.
2.
3.
4.
5.
create	table	dbo.Tree
(	Id		int	identity ( 1,	1 )	primary	key
	,Parent		int	references	dbo.Tree ( Id )
	,Name		varchar ( 256 )
	,Sequence	int	null )


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



Вариант 2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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 )



Проверка
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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


Какой вариант при эксплуатации имеет большие накладные расходы? Материализация и там и там место на диске тратит.
...
Рейтинг: 0 / 0
contraint Unique or Null
    #39648522
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tunknown,

я бы дальше первого варианта никогда и не подумал так извращаться. Ну и накладные на 2 будут точно больше
...
Рейтинг: 0 / 0
contraint Unique or Null
    #39648531
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tunknown,

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

ЗЫ: UQorNull можно и не делать persisted.
...
Рейтинг: 0 / 0
contraint Unique or Null
    #39648535
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

так он и так получил уникальный некластерный. А фильтровать там что? NOT NULL? так имхо у него это требование
...
Рейтинг: 0 / 0
contraint Unique or Null
    #39648548
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
CREATE UNIQUE INDEX uiSequence ON dbo.Tree(Sequence) WHERE Sequence IS NOT NULL;
...
Рейтинг: 0 / 0
contraint Unique or Null
    #39648550
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sequence - ключевое слово. Лучше не надо поле так называть.
...
Рейтинг: 0 / 0
contraint Unique or Null
    #39648557
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,

ну и Parent если пишет "в пределах другого поля"
...
Рейтинг: 0 / 0
contraint Unique or Null
    #39648568
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

Ему нужна уникальность (Parent, Sequence) без учета строк с null в Sequence.
...
Рейтинг: 0 / 0
contraint Unique or Null
    #39648572
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmTaPaK,

Ему нужна уникальность (Parent, Sequence) без учета строк с null в Sequence.Вообще-то, и в Parent несколько NULL не помешает иногда иметь. Если допустимы несколько корней, например.
...
Рейтинг: 0 / 0
contraint Unique or Null
    #39648576
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapinvmTaPaK,

Ему нужна уникальность (Parent, Sequence) без учета строк с null в Sequence.Вообще-то, и в Parent несколько NULL не помешает иногда иметь. Если допустимы несколько корней, например.Можно, конечно, определить корень как Parent=Id.
Но мне кажется, Parent IS NULL как-то красивее смотрится.
...
Рейтинг: 0 / 0
contraint Unique or Null
    #39648579
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapiapпропущено...
Вообще-то, и в Parent несколько NULL не помешает иногда иметь. Если допустимы несколько корней, например.Можно, конечно, определить корень как Parent=Id.
Но мне кажется, Parent IS NULL как-то красивее смотрится.
ну практически всегда мы 0 делаем, или же как вы пишете Parent=Id(но это чаще для внутренней обработки меняя 0). Null же вообще развалит уникальность
...
Рейтинг: 0 / 0
contraint Unique or Null
    #39648818
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKiapпропущено...
Можно, конечно, определить корень как Parent=Id.
Но мне кажется, Parent IS NULL как-то красивее смотрится.
ну практически всегда мы 0 делаем, или же как вы пишете Parent=Id(но это чаще для внутренней обработки меняя 0). Null же вообще развалит уникальностьЕсли Id - IDENTITY, а Parent - NOT NULL, то Parent=Id обеспечить не так-то и просто.
...
Рейтинг: 0 / 0
contraint Unique or Null
    #39648891
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmtunknown,

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

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

Фильтрованный уникальный вполне работает в таких случаях.
...
Рейтинг: 0 / 0
contraint Unique or Null
    #39648908
tunknown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmОбязательно constraint? Фильтрованный уникальный индекс не подойдет?Спасибо. Узнал новую для себя возможность. Прямо хоть whats new перечитывай:-(
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / contraint Unique or Null
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]