2015-06-25 6 views
2

У меня есть таблица, которую я буду использовать для подсчета. Внутри этой таблицы у меня есть следующие столбцы: T_ID, L_ID, L1, L2, L3, L4, L5. L_ID имеет тип данных INT. Значение в L_ID может увеличиться до 5. Я хочу создать триггер, который проверяет значение в L_ID, в зависимости от этого значения, будет ли оно от 1 до 5. Оно увеличит соответствующий столбец L1, L2, L3, L4, L5 , эти значения автоматически равны нулю. Например, L_ID = 3, поэтому L3 будет увеличиваться на единицу.Как увеличить отдельный столбец на основе значения в другом столбце в той же таблице

+1

Какие СУБД вы используете? – Quassnoi

+0

Также, что такое триггер? Вставить, обновить или что? – Quassnoi

+0

@brian tompsett Я использую студию управления sql server 2014 и ее триггер обновления –

ответ

0

Итак, вы можете сделать это с помощью выражений case и вместо триггеров вставки/обновления вместо вместо вставки для исходной вставки (если вы хотите, чтобы это поведение было на исходной вставке, а не только на все столбцы Lx в 0:

CREATE TRIGGER [dbo].[InsteadTrigger] ON [dbo].[original_table] 
    INSTEAD OF INSERT 
AS 
    INSERT INTO original_table 
      SELECT L_ID , 
        CASE WHEN L_ID = 1 THEN L1 + 1 
         ELSE L1 
        END , 
        CASE WHEN L_ID = 2 THEN L2 + 1 
         ELSE L2 
        END , 
        CASE WHEN L_ID = 3 THEN L3 + 1 
         ELSE L3 
        END , 
        CASE WHEN L_ID = 4 THEN L4 + 1 
         ELSE L4 
        END , 
        CASE WHEN L_ID = 5 THEN L5 + 1 
         ELSE L5 
        END 
      FROM INSERTED; 
     GO 

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

CREATE TRIGGER InsteadUpdTrigger ON original_table 
    INSTEAD OF UPDATE 
AS 
    UPDATE original_table 
    SET  L_ID = i.L_ID , 
      L1 = CASE WHEN i.L_ID = 1 THEN i.L1 + 1 
         ELSE i.L1 
       END , 
      L2 = CASE WHEN i.L_ID = 2 THEN i.L2 + 1 
         ELSE i.L2 
       END , 
      L3 = CASE WHEN i.L_ID = 3 THEN i.L3 + 1 
         ELSE i.L3 
       END , 
      L4 = CASE WHEN i.L_ID = 4 THEN i.L4 + 1 
         ELSE i.L4 
       END , 
      L5 = CASE WHEN i.L_ID = 5 THEN i.L5 + 1 
         ELSE i.L5 
       END 
    FROM INSERTED i 
    WHERE original_table.T_ID = i.T_ID; 

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

Смежные вопросы