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

Откуда: Архангельск
Сообщений: 59
Здравствуйте.
Проблема такая:

Есть таблица t_BLA:
CREATE TABLE t_BLA (
fBLA int NULL, 
fBLA1  int NOT NULL)

Поле fBla может иметь значение NULL во многих записях одновременно (хоть во всех), но если в поле заносим значение NotNull, то тогда повторов быть не должно.
Если ставлю на поле Unique Constraint, то на уникальность проверяются и значения NULL (что меня не устраивает)

Поэтому создал триггер. В принципе, он работает, но хотелось бы выслушать Ваше мнение по проблеме. Я в T-SQL не силен: может чего лишнего слепил, или наоборот, что-нибуть проморгал. Посмотрите, пожалуйста.

А может быть вообще можно обойтись без триггеров.
Спасибо

CREATE TRIGGER [tri_BLA_IUX] ON [dbo].[t_BLA] 
FOR INSERT, UPDATE 
AS
If UPDATE(fBla) 
BEGIN

if exists (
SELECT *
FROM inserted INNER JOIN t_bla ON inserted.fbla = t_bla.fbla
WHERE ((inserted.fbla Is Not Null) AND (t_bla.fbla<>inserted.fbla))
)
begin
	RAISERROR ('Error tri', 16, 1)
	ROLLBACK TRANSACTION
end
END
25 окт 04, 09:52    [1057348]     Ответить | Цитировать Сообщить модератору
 Re: Контроль уникальности значений поля для значений NotNull  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
без триггера

create table a (id int primary key, a int null, a1 as (case when a is null then 1 else a end))
create unique index a1_a on a (id, a1)
25 окт 04, 12:12    [1057805]     Ответить | Цитировать Сообщить модератору
 Re: Контроль уникальности значений поля для значений NotNull  [new]
SRG
Member

Откуда: Архангельск
Сообщений: 59
автор
create table a (id int primary key, a int null, a1 as (case when a is null then 1 else a end))
create unique index a1_a on a (id, a1)


Не работает :(
Такая таблица позволяет хранить такие данные:
id a
1 null
2 null
3 1
4 1

a=1 не должно повторяться

Кстати. в предыдущем посте текст триггера неверный (запутался, пока перепечатывал).

Вместо
WHERE ((inserted.fbla Is Not Null) AND (t_bla.fbla<>inserted.fbla))

Должно быть так:
WHERE ((inserted.fbla Is Not Null) AND (t_bla.fID<>inserted.fID))

(Поле fID - primary key, identity, not null)
25 окт 04, 12:57    [1057968]     Ответить | Цитировать Сообщить модератору
 Re: Контроль уникальности значений поля для значений NotNull  [new]
Glory
Member

Откуда:
Сообщений: 104760
use tempdb
go
if object_id('[dbo].[testtable]') is not null drop table [dbo].[testtable]
go
CREATE TABLE [dbo].[testtable] (
     [testtableId] [int] IDENTITY (1, 1) NOT NULL ,
     [somevalue] [varchar] (50) NULL ,
     [onlyone] AS case  when [somevalue] is null  then [testtableId] else -1 end,
     constraint ck_onlyone unique ([somevalue], [onlyone])

) ON [PRIMARY]
GO


insert [dbo].[testtable] values('value1')
insert [dbo].[testtable] values(NULL)
insert [dbo].[testtable] values(NULL)
insert [dbo].[testtable] values('value1')
go
select * from [dbo].[testtable]
go
if object_id('[dbo].[testtable]') is not null drop table [dbo].[testtable]
go
25 окт 04, 13:01    [1057986]     Ответить | Цитировать Сообщить модератору
 Re: Контроль уникальности значений поля для значений NotNull  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
было check constraint + UDF
25 окт 04, 13:02    [1057988]     Ответить | Цитировать Сообщить модератору
 Re: Контроль уникальности значений поля для значений NotNull  [new]
SRG
Member

Откуда: Архангельск
Сообщений: 59
Glory
... [dbo].[testtable] ...


Спасибо. Заработало :)
25 окт 04, 13:27    [1058121]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить