
DbSchema | MySQL - How to Create a Trigger?
What is a Trigger?
A trigger in MySQL is a set of actions automatically executed in response to certain events that occur on a database table. You don't need to manually execute these actions, because the trigger runs automatically when an event like an INSERT, UPDATE, or DELETE occurs on a table.
Triggers are great for automating tasks, enforcing business rules, and maintaining data integrity.
Common Trigger Events
- INSERT: Executes when a new row is inserted into a table.
- UPDATE: Executes when a row is updated in a table.
- DELETE: Executes when a row is deleted from a table.
You can create triggers that run:
- Before the event (
BEFORE INSERT
,BEFORE UPDATE
,BEFORE DELETE
). - After the event (
AFTER INSERT
,AFTER UPDATE
,AFTER DELETE
).
Example 1: Logging Updates in a Table
Imagine you have a products
table and want to keep track of any updates to product prices. Every time the price of a product is updated, you want to insert a record into a product_price_log
table to log the changes (old price, new price, and the timestamp).
Step 1: Create the products Table
CREATE TABLE company.products (
product_id INT PRIMARY KEY,
product_name VARCHAR(100),
price DECIMAL(10, 2)
);
Step 2: Create the product_price_log Table
CREATE TABLE company.product_price_log (
log_id INT AUTO_INCREMENT PRIMARY KEY,
product_id INT,
old_price DECIMAL(10, 2),
new_price DECIMAL(10, 2),
change_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Step 3: Create the Trigger
This trigger will fire before an update occurs to the price column in the products table. It logs the old and new prices in the product_price_log table.
DELIMITER $$
CREATE TRIGGER before_product_price_update
BEFORE UPDATE ON company.products
FOR EACH ROW
BEGIN
IF OLD.price <> NEW.price THEN
INSERT INTO company.product_price_log (product_id, old_price, new_price)
VALUES (OLD.product_id, OLD.price, NEW.price);
END IF;
END $$
DELIMITER ;
Explanation:
-
BEFORE UPDATE: The trigger runs before the UPDATE operation is performed on the products table.
-
OLD and NEW: OLD refers to the values before the update, NEW refers to the values after the update.
-
Condition: The trigger only logs a change if the price has actually been modified (OLD.price <> NEW.price).
Step 4: Test the Trigger
-
Insert Sample Data:
INSERT INTO company.products (product_id, product_name, price) VALUES (1, 'Sample Product', 20.00);
-
Update the price:
UPDATE company.products SET price = 25.00 WHERE product_id = 1;
-
Query the Log:
SELECT * FROM company.product_price_log;
See the results in DbSchema, a SQL client for designing and manage your MySQL database!
-
If you want to dive deeper into MySQL triggers and database management, check out the MySQL Documentation. For solutions to common MySQL issues, you can also visit Stack Overflow.
-
Once you’re familiar with the basics of MySQL triggers, you might want to explore the tools that make it easier to write and execute SQL queries. For a detailed guide on a free SQL editor, check out our free SQL editor guide.