Как установить значение по умолчанию для одного столбца в SQL на основе другого столбца - PullRequest
13 голосов
/ 02 апреля 2009

Я работаю со старой базой данных SQL 2000, и у меня не так много опыта работы с SQL. Когда новая строка добавляется в одну из моих таблиц, мне нужно назначить значение времени по умолчанию на основе столбца для рабочей категории.

Например, для категории работы A будет назначено значение времени 1 час, для категории B - 2 часа и т. Д. *

Значение следует устанавливать только в том случае, если пользователь вручную не вводит время, затраченное им на выполнение работы. Я думал об этом с ограничением по умолчанию, но не думаю, что это сработает, если значение по умолчанию имеет зависимость.

Как лучше всего это сделать?

Ответы [ 8 ]

9 голосов
/ 02 апреля 2009

Я бы использовал триггер на Insert.

Просто проверьте, было ли присвоено значение, и если нет, то найдите правильное и используйте его.

6 голосов
/ 05 августа 2010

Используйте триггер, предложенный Стивеном Райтоном:

CREATE TRIGGER [myTable_TriggerName] ON dbo.myTable FOR INSERT        
AS
SET NOCOUNT ON
UPDATE myTable
SET
    timeValue = '2 hours' -- assuming string values
where ID in (
    select ID
    from INSERTED
    where
        timeValue = ''
        AND workCategory = 'A'
)
2 голосов
/ 03 апреля 2013

Если вам нужно определить определение столбца на основе другого столбца, вы можете сделать что-то вроде этого:

create table testable 
(
    c1 int, 
    c2 datetime default getdate(), 
    c3 as year(c2)
);

insert into testable (c1) select 1

select * from testable;

Ваш набор результатов должен выглядеть следующим образом:

c1 | c2                      | c3
1  | 2013-04-03 17:18:43.897 | 2013

Как вы можете видеть, AS (в определении столбца) делает свое дело;) Надеюсь, это помогло.

2 голосов
/ 03 апреля 2009

Обязательно напишите триггер, чтобы он обрабатывал многорядные вставки. Не обрабатывайте по одной строке за один раз в триггере или предполагайте, что во вставленной таблице будет только одна строка.

1 голос
/ 20 ноября 2014

Я могу придумать два пути:

  1. триггеры
  2. значение по умолчанию или привязка (это должно работать с зависимостью)

Триггеры здесь хорошо объяснены, поэтому я не буду подробно останавливаться. Но обычно я стараюсь держаться подальше от триггеров для такого рода вещей, так как они больше подходят для других задач

«Значение по умолчанию или привязка» может быть достигнуто путем создания функции, например:

CREATE FUNCTION [dbo].[ComponentContractor_SortOrder] ()
RETURNS float
AS
BEGIN
RETURN (SELECT MAX(SortOrder) + 5 FROM [dbo].[tblTender_ComponentContractor])
END

И затем для параметра "значение по умолчанию или привязка" для этого столбца установлено значение ([dbo] .ComponentContractor_SortOrder)

1 голос
/ 02 октября 2009

Так, например, в таблице TAG (где теги применяются к сообщениям), если вы хотите считать один тег как другой ... но по умолчанию считать новые теги как самих себя, у вас будет триггер, подобный этому:

CREATE TRIGGER [dbo].[TR_Tag_Insert]
   ON  [dbo].[Tag]
   AFTER INSERT
AS 
BEGIN
   SET NOCOUNT ON;

   UPDATE dbo.Tag 
   SET [CountAs] = I.[ID]
   FROM INSERTED AS I
   WHERE I.[CountAs] IS NULL
   AND dbo.Tag.ID = I.ID
END
1 голос
/ 02 апреля 2009

Да, триггер.

Естественно, вместо жесткого кодирования значений по умолчанию вы будете искать их из таблицы.

Расширяя это, ваша новая таблица затем становится таблицей work_category (id, name, default_hours), а ваша исходная таблица сохраняет внешний ключ к ней, преобразовывая fom (id, рабочая_категория, часы) в (id, рабочая_категория, часы).

0 голосов
/ 02 апреля 2009

Вообще я держусь подальше от триггеров. Почти все базы данных имеют некоторую поддержку ограничений .

Я считаю, что их легче понять, отладить и поддерживать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...