UPDATE trigger with OLD and NEW in SQL - Time & Space Complexity
When a database updates a row, triggers can run extra code automatically. We want to understand how the time to run this trigger changes as more rows are updated.
How does the trigger's work grow when updating many rows?
Analyze the time complexity of the following SQL trigger.
CREATE TRIGGER update_log_trigger
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
INSERT INTO employees_log(employee_id, old_salary, new_salary, changed_at)
VALUES (OLD.id, OLD.salary, NEW.salary, CURRENT_TIMESTAMP);
END;
This trigger runs after each employee row is updated. It logs the old and new salary values into a log table.
Look for repeated actions inside the trigger.
- Primary operation: The trigger runs once for every updated row.
- How many times: Exactly as many times as there are rows updated.
Each updated row causes one insert into the log table, so the work grows directly with the number of rows.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 inserts into log |
| 100 | 100 inserts into log |
| 1000 | 1000 inserts into log |
Pattern observation: The work grows in a straight line as the number of updated rows increases.
Time Complexity: O(n)
This means the time to run the trigger grows directly in proportion to how many rows are updated.
[X] Wrong: "The trigger runs only once no matter how many rows are updated."
[OK] Correct: The trigger is defined FOR EACH ROW, so it runs once per updated row, not just once per update statement.
Understanding how triggers scale helps you write efficient database code and explain performance in real projects. This skill shows you think about how data size affects work done.
"What if the trigger was defined FOR EACH STATEMENT instead of FOR EACH ROW? How would the time complexity change?"
Practice
OLD and NEW keywords represent in an UPDATE trigger?Solution
Step 1: Understand trigger timing
In anUPDATEtrigger,OLDholds the row data before the update happens.Step 2: Understand data after update
NEWholds the row data after the update is applied.Final Answer:
OLDis the data before update;NEWis the data after update -> Option DQuick Check:
OLD = before, NEW = after [OK]
- Confusing OLD and NEW roles
- Thinking both OLD and NEW hold same data
- Assuming OLD is after update
salary inside an UPDATE trigger?Solution
Step 1: Identify how to reference NEW values in triggers
Inside anUPDATEtrigger, you access new column values usingNEW.column_name.Step 2: Match syntax for column
So, the correct way issalaryNEW.salary.Final Answer:
NEW.salary -> Option AQuick Check:
Use NEW.column_name to get updated value [OK]
- Using OLD.salary to get new value
- Trying to SELECT from NEW as a table
- Incorrect UPDATE syntax inside trigger
UPDATE trigger:IF NEW.status = 'active' AND OLD.status = 'inactive' THEN
INSERT INTO log_table(action) VALUES('Activated');
END IF;What happens when a row's
status changes from 'inactive' to 'active'?Solution
Step 1: Understand the condition in the trigger
The condition checks if the new status is 'active' and the old status was 'inactive'.Step 2: Effect of condition being true
If true, it inserts a row intolog_tablewith action 'Activated'.Final Answer:
A new row with action 'Activated' is inserted intolog_table-> Option BQuick Check:
Condition true triggers insert [OK]
- Thinking OLD and NEW cannot be compared
- Assuming no insert happens on status change
- Believing update cancels automatically
CREATE TRIGGER trg_update BEFORE UPDATE ON employees
FOR EACH ROW
BEGIN
IF NEW.salary < OLD.salary THEN
SET NEW.salary = OLD.salary;
END IF;
END;But when you try to update salary to a lower value, it still changes. What is the problem?
Solution
Step 1: Check trigger syntax completeness
In many SQL systems, triggers require a delimiter change to define the body properly.Step 2: Missing delimiter causes trigger body to be incomplete
Without proper delimiters, the trigger may not compile or behave as expected.Final Answer:
The trigger syntax is missing a delimiter or terminator -> Option AQuick Check:
Triggers need delimiters to parse body correctly [OK]
- Assuming AFTER triggers can modify NEW
- Thinking NEW cannot be assigned in BEFORE triggers
- Ignoring delimiter requirements in SQL triggers
UPDATE trigger that prevents lowering a product's price. If the new price is less than the old price, the trigger should reset the price to the old value and log the attempt. Which trigger code correctly implements this?Solution
Step 1: Identify correct trigger timing and condition
Use a BEFORE UPDATE trigger to modify NEW values before update. Condition should check if NEW.price is less than OLD.price.Step 2: Correctly reset price and log attempt
If condition true, set NEW.price = OLD.price to prevent lowering, then insert a log record with OLD and attempted NEW price.Final Answer:
BEFORE UPDATE trigger that prevents lowering price and logs the attempt -> Option CQuick Check:
BEFORE UPDATE + NEW.price < OLD.price + reset + log [OK]
- Using AFTER UPDATE and trying to modify NEW
- Reversing price comparison logic
- Not logging the attempted price change
Ready to prove it?
Pass the test and this pattern moves unknown
