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

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

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

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

Каким будет лучший способ сделать это?

Ответы

Ответ 1

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

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

Ответ 2

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

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'
)

Ответ 3

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

Ответ 4

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

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 (в определении столбца) делает трюк;) Надеюсь, что это помогло.

Ответ 5

Да, триггер.

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

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

Ответ 6

Так, например, в таблице 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

Ответ 7

Как правило, я уклоняюсь от триггеров. Почти все dbms имеют некоторую поддержку ограничений.

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

Ответ 8

Я могу думать о двух путях:

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

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

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

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

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