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

Откуда:
Сообщений: 554
Таблица такого типа:
CREATE TABLE [dbo].[Table_1](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[col1] [int] NOT NULL,
	[col2] [bit] NOT NULL,
	[col3] [int] NOT NULL
) ON [PRIMARY]

Задача передо мной стоит такая:
- если в поле [col2] кладется 1, то ограничение было по столбцу [col1]
- если в поле [col2] кладется 0, то ограничение было по столбцу [col3]

Тригерами пользоваться не очень хочется, может можно как-нибудь ограничение сделать для такой задачи?!
31 авг 09, 18:20    [7599874]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36800
Два вычисляемых столбца и индекс по ним. Как-то так:

col4 as case when col2 = 1 then col1 else - id end
col5 as case when col2 = 0 then col3 else - id end
31 авг 09, 18:22    [7599883]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности  [new]
blest
Member

Откуда:
Сообщений: 554
Гавриленко Сергей Алексеевич
Два вычисляемых столбца и индекс по ним. Как-то так:

col4 as case when col2 = 1 then col1 else - id end
col5 as case when col2 = 0 then col3 else - id end


Индекс на каждый столбец, или составной на два столбца?
хотя у меня ни в одном случае уникальности не получается(
31 авг 09, 19:28    [7600100]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36800
blest
Гавриленко Сергей Алексеевич
Два вычисляемых столбца и индекс по ним. Как-то так:

col4 as case when col2 = 1 then col1 else - id end
col5 as case when col2 = 0 then col3 else - id end


Индекс на каждый столбец, или составной на два столбца?
хотя у меня ни в одном случае уникальности не получается(
if object_id('tempdb..#t') is not null
    drop table #t
go    
create table #t(
    [id]        [int] identity(1,1) not null
    , [col1]    [int] not null
    , [col2]    [bit] not null
    , [col3]    [int] not null
    , col4      as case when col2 = 1 then col1 else -id end 
    , col5      as case when col2 = 0 then col3 else -id end 
    , unique (col4)
    , unique (col5)
)
go

-- Этот вставляется
insert #t(col2, col1 , col3)
select 1, 1, 1

-- Этот обламывается
insert #t(col2, col1 , col3)
select 1, 1, 2

-- Этот вставляется
insert #t(col2, col1 , col3)
select 0, 1, 1

-- Этот обламывается
insert #t(col2, col1 , col3)
select 0, 2, 1
31 авг 09, 19:50    [7600141]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности  [new]
blest
Member

Откуда:
Сообщений: 554
Гавриленко Сергей Алексеевич,

Спасибо, идея ясна. Но в предложенном вами случая я так понял можно будет использовать только положительную сторону интеджера?!
31 авг 09, 20:15    [7600181]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36800
blest
Гавриленко Сергей Алексеевич,

Спасибо, идея ясна. Но в предложенном вами случая я так понял можно будет использовать только положительную сторону интеджера?!
Ну сделайте cast(id as bigint) + [максимальное значение инта] + 1. Тогда суррогаты не будут попадать в диапазон ваших реальных значений.
31 авг 09, 21:20    [7600326]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности  [new]
blest
Member

Откуда:
Сообщений: 554
Гавриленко Сергей Алексеевич
blest
Гавриленко Сергей Алексеевич,

Спасибо, идея ясна. Но в предложенном вами случая я так понял можно будет использовать только положительную сторону интеджера?!
Ну сделайте cast(id as bigint) + [максимальное значение инта] + 1. Тогда суррогаты не будут попадать в диапазон ваших реальных значений.


Ну да, действительно. Это же вычисляемый стоблец) еще раз спасибо
1 сен 09, 11:25    [7601930]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить