Как создать ограничение по умолчанию, зависящее от другого столбца на сервере sql

у меня такая таблица

вкладка1

create table tab1(ID int identity(1,1), Type varchar(10),IsValued bit)

вкладка1:

ID Type IsValued
----------------
1   S   1
2   R   0
3   R   0
4   S   1
5   S   1
6   R   0
7   S   1

вместо того, чтобы вставлять значение в столбец IsValued, я хочу создать одно ограничение (НЕ TRIGGER), когда Type = 'S', IsValued должен быть вставлен как 1, а когда Type = 'R', IsValued должен быть вставлен как 0

нравится: IsValued = case when Type ='S' then 1 when Type ='R' then 0 end

Как я могу добиться этого..


person Ram Das    schedule 20.03.2013    source источник


Ответы (1)


Вам нужен вычисляемый столбец. Например:

CREATE TABLE tab1
(
 ID INT IDENTITY(1,1)
,[Type] VARCHAR(10)
,IsValued AS CASE [Type] WHEN 'S' THEN 1
                         WHEN 'R' THEN 0
             END
)

Вы можете добавить в существующую таблицу, используя следующий синтаксис:

ALTER TABLE dbo.tab1 ADD IsValued AS CASE [Type] WHEN 'S' THEN 1
                                                 WHEN 'R' THEN 0
                                     END

Вы можете сделать столбец постоянным, добавив ключевое слово PERSISTED после создания столбца. Сохранение столбца означает, что поле сохраняется на диске. Когда вы вставляете или обновляете запись, SQL-сервер вычисляет значение в этой точке. Если вы этого не сделаете, SQL Server должен будет обрабатывать это каждый раз, когда вы обращаетесь к строке. Хорошее объяснение можно найти в разделе Вычисляемый столбец SQL Server 2005 сохраняется.

ALTER TABLE dbo.tab1 ADD IsValued AS CASE [Type] WHEN 'S' THEN 1
                                                 WHEN 'R' THEN 0
                                     END PERSISTED
person twoleggedhorse    schedule 20.03.2013
comment
этот столбец IsValued добавлен в эту таблицу заново, например: изменить таблицу tab1 добавить бит IsValued - person Ram Das; 20.03.2013
comment
@sharath Я обновил свой пример специально для вашего вопроса. - person twoleggedhorse; 20.03.2013
comment
@sharath Небольшое примечание: вы можете добавить слово PERSISTED после END . Объяснение здесь stackoverflow.com/questions /916068/ - person twoleggedhorse; 21.03.2013
comment
хорошо.. но что, если этот столбец уже присутствует в этой таблице. @twoleggedhorse получает ошибку при этом. ALTER TABLE dbo.tab1 ALTER COLUMN IsValued AS CASE [Type] WHEN 'S' THEN 1 WHEN 'R' THEN 0 END PERSISTED - person Ram Das; 25.03.2013
comment
@RamDas Вы можете изменять столбцы только с определенными условиями: sqlserverplanet.com/ddl/alter-table -alter-column Вероятно, вам придется удалить столбец, а затем добавить его с ключевым словом. ALTER TABLE dbo.tab1 DROP COLUMN IsValued - person twoleggedhorse; 25.03.2013