Triggers automatically run a set of actions when something changes in the database. This helps keep data correct and saves time by doing tasks without needing to ask.
When you want to log changes to important data automatically.
When you need to check or change data right after it is added or updated.
When you want to keep related tables in sync without manual work.
When you want to enforce rules like preventing bad data from being saved.
When you want to send alerts or notifications after certain changes happen.
Syntax
MySQL
CREATE TRIGGER trigger_name
BEFORE|AFTER INSERT|UPDATE|DELETEON table_name
FOR EACH ROW
BEGIN
-- SQL statements to run automaticallyEND;
Triggers run automatically before or after data changes like insert, update, or delete.
You write the SQL code inside the BEGIN and END block to define what happens.
Examples
This trigger adds a record to an audit log every time a new employee is added.
MySQL
CREATE TRIGGER log_insert
AFTER INSERTON employees
FOR EACH ROW
BEGIN
INSERTINTO audit_log(action, emp_id) VALUES('insert', NEW.id);
END;
This trigger stops any update that tries to set a negative salary.
MySQL
CREATE TRIGGER check_salary
BEFORE UPDATEON employees
FOR EACH ROW
BEGIN
IF NEW.salary < 0THEN
SIGNAL SQLSTATE '45000'SET MESSAGE_TEXT = 'Salary cannot be negative';
END IF;
END;
Sample Program
This example creates two tables: one for employees and one for logging actions. The trigger adds a log entry every time a new employee is added. Then it inserts one employee and shows the log.
MySQL
CREATETABLE employees (
id INTPRIMARYKEY AUTO_INCREMENT,
name VARCHAR(50),
salary DECIMAL(10,2)
);
CREATETABLE audit_log (
id INTPRIMARYKEY AUTO_INCREMENT,
action VARCHAR(20),
emp_id INT,
action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
DELIMITER $$
CREATE TRIGGER after_employee_insert
AFTER INSERTON employees
FOR EACH ROW
BEGIN
INSERTINTO audit_log(action, emp_id) VALUES('insert', NEW.id);
END$$
DELIMITER ;
INSERTINTO employees(name, salary) VALUES('Alice', 50000);
SELECT * FROM audit_log;
OutputSuccess
Important Notes
Triggers can slow down data changes if they do a lot of work, so keep them simple.
Use triggers carefully to avoid unexpected side effects or loops.
Summary
Triggers run automatically when data changes happen.
They help keep data correct and automate tasks.
You write triggers using CREATE TRIGGER with BEFORE or AFTER events.
Practice
(1/5)
1. What is the main purpose of a trigger in MySQL?
easy
A. To backup the database automatically
B. To create new tables in the database
C. To manually update data by user command
D. To automatically run code when data changes
Solution
Step 1: Understand what triggers do
Triggers run automatically when certain data changes happen in the database, like insert, update, or delete.
Step 2: Compare options with trigger purpose
Only To automatically run code when data changes describes automatic code running on data changes, which matches the trigger's role.
Final Answer:
To automatically run code when data changes -> Option D
Quick Check:
Trigger = automatic response to data change [OK]
Hint: Triggers run code automatically on data changes [OK]
Common Mistakes:
Thinking triggers create tables
Confusing triggers with manual commands
Assuming triggers backup data
2. Which of the following is the correct way to start creating a trigger in MySQL?
easy
A. CREATE TRIGGER trigger_name BEFORE INSERT ON table_name FOR EACH ROW
B. MAKE TRIGGER trigger_name AFTER DELETE ON table_name
C. START TRIGGER trigger_name ON table_name
D. BEGIN TRIGGER trigger_name BEFORE UPDATE
Solution
Step 1: Recall MySQL trigger syntax
The correct syntax starts with CREATE TRIGGER, followed by trigger name, timing (BEFORE/AFTER), event (INSERT/UPDATE/DELETE), and table name.
Step 2: Check each option's syntax
Only CREATE TRIGGER trigger_name BEFORE INSERT ON table_name FOR EACH ROW matches the correct syntax format exactly.
Final Answer:
CREATE TRIGGER trigger_name BEFORE INSERT ON table_name FOR EACH ROW -> Option A
Quick Check:
Correct syntax starts with CREATE TRIGGER [OK]
Hint: Trigger syntax starts with CREATE TRIGGER [OK]
Common Mistakes:
Using MAKE or START instead of CREATE
Missing FOR EACH ROW clause
Wrong order of keywords
3. Given this trigger code:
CREATE TRIGGER update_stock AFTER INSERT ON sales FOR EACH ROW BEGIN UPDATE products SET stock = stock - NEW.quantity WHERE product_id = NEW.product_id; END;
What happens when a new sale is inserted?
medium
A. The stock of the sold product decreases by the sold quantity
B. The stock of all products increases
C. The sales table is deleted
D. Nothing happens automatically
Solution
Step 1: Analyze the trigger event and action
The trigger runs AFTER INSERT on sales table, so after a sale is added, it updates products stock.
Step 2: Understand the update statement
The update reduces stock by NEW.quantity for the product matching NEW.product_id, meaning stock decreases for sold product.
Final Answer:
The stock of the sold product decreases by the sold quantity -> Option A
Quick Check:
AFTER INSERT trigger updates stock correctly [OK]
Hint: AFTER INSERT triggers run after new rows added [OK]
Common Mistakes:
Thinking stock increases instead of decreases
Assuming trigger deletes tables
Believing trigger does nothing automatically
4. This trigger code causes an error:
CREATE TRIGGER wrong_trigger BEFORE UPDATE ON orders BEGIN SET NEW.status = 'processed'; END;
What is the main problem?
medium
A. Cannot assign values to NEW in triggers
B. Missing FOR EACH ROW clause after table name
C. Cannot use BEFORE UPDATE triggers in MySQL
D. Trigger name cannot have underscores
Solution
Step 1: Check trigger syntax requirements
MySQL requires FOR EACH ROW clause after the table name in triggers that act on rows.
Step 2: Identify missing part in code
The code misses FOR EACH ROW after ON orders, causing syntax error.
Final Answer:
Missing FOR EACH ROW clause after table name -> Option B
Quick Check:
FOR EACH ROW is mandatory in row-level triggers [OK]
Hint: Always include FOR EACH ROW in row triggers [OK]
Common Mistakes:
Thinking BEFORE UPDATE triggers are not allowed
Believing NEW cannot be assigned
Assuming trigger names cannot have underscores
5. You want to ensure that when a user's email is updated, a log entry is automatically created in a separate table. Which trigger setup best automates this?
hard
A. CREATE TRIGGER log_email_change AFTER DELETE ON users FOR EACH ROW BEGIN INSERT INTO email_log(user_id, old_email, new_email) VALUES (NEW.id, OLD.email, NEW.email); END;
B. CREATE TRIGGER log_email_change BEFORE INSERT ON users FOR EACH ROW BEGIN INSERT INTO email_log(user_id, old_email, new_email) VALUES (NEW.id, OLD.email, NEW.email); END;
C. CREATE TRIGGER log_email_change AFTER UPDATE ON users FOR EACH ROW BEGIN INSERT INTO email_log(user_id, old_email, new_email) VALUES (NEW.id, OLD.email, NEW.email); END;
D. CREATE TRIGGER log_email_change BEFORE UPDATE ON users BEGIN INSERT INTO email_log(user_id, old_email, new_email) VALUES (NEW.id, OLD.email, NEW.email); END;
Solution
Step 1: Identify correct trigger timing and event
We want to log after the email changes, so AFTER UPDATE is correct to capture new and old values.
Step 2: Check trigger syntax and usage of OLD and NEW
CREATE TRIGGER log_email_change AFTER UPDATE ON users FOR EACH ROW BEGIN INSERT INTO email_log(user_id, old_email, new_email) VALUES (NEW.id, OLD.email, NEW.email); END; uses FOR EACH ROW and correctly inserts old and new email values into log table after update.
Final Answer:
CREATE TRIGGER log_email_change AFTER UPDATE ON users FOR EACH ROW BEGIN INSERT INTO email_log(user_id, old_email, new_email) VALUES (NEW.id, OLD.email, NEW.email); END; -> Option C
Quick Check:
AFTER UPDATE with OLD and NEW logs changes [OK]
Hint: Use AFTER UPDATE with OLD and NEW for logging changes [OK]
Common Mistakes:
Using BEFORE INSERT instead of AFTER UPDATE
Missing FOR EACH ROW clause
Using AFTER DELETE when updating data
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.