SQL/MySQL/Trigger/NEW
Содержание
Change NEW value in a before insert trigger
<source lang="sql">
mysql> mysql> mysql> CREATE TABLE Employee(
-> id int, -> first_name VARCHAR(15), -> last_name VARCHAR(15), -> start_date DATE, -> end_date DATE, -> salary FLOAT(8,2), -> city VARCHAR(10), -> description VARCHAR(15) -> );
Query OK, 0 rows affected (0.02 sec) mysql> mysql> mysql> delimiter $$ mysql> mysql> CREATE TRIGGER myTrigger
-> BEFORE INSERT ON employee -> FOR EACH ROW -> BEGIN -> DECLARE row_count INTEGER; -> -> SELECT COUNT(*) -> INTO row_count -> FROM employee -> WHERE id=NEW.id; -> -> IF row_count > 0 THEN -> UPDATE employee -> SET salary = salary+NEW.salary -> WHERE id=NEW.id; -> ELSE -> INSERT INTO employee (id,salary) VALUES(NEW.id,NEW.salary); -> END IF; -> -> END$$
Query OK, 0 rows affected (0.00 sec) mysql> mysql> delimiter ; mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values (1,"Jason", "Martin", "19960725", "20060725", 1234.56, "Toronto", "Programmer");
ERROR 1442 (HY000): Can"t update table "employee" in stored function/trigger because it is already used by statement which invoked this stored function/trigger. mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(2,"Alison", "Mathews", "19760321", "19860221", 6661.78, "Vancouver","Tester");
ERROR 1442 (HY000): Can"t update table "employee" in stored function/trigger because it is already used by statement which invoked this stored function/trigger. mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(3,"James", "Smith", "19781212", "19900315", 6544.78, "Vancouver","Tester");
ERROR 1442 (HY000): Can"t update table "employee" in stored function/trigger because it is already used by statement which invoked this stored function/trigger. mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(4,"Celia", "Rice", "19821024", "19990421", 2344.78, "Vancouver","Manager");
ERROR 1442 (HY000): Can"t update table "employee" in stored function/trigger because it is already used by statement which invoked this stored function/trigger. mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(5,"Robert", "Black", "19840115", "19980808", 2334.78, "Vancouver","Tester");
ERROR 1442 (HY000): Can"t update table "employee" in stored function/trigger because it is already used by statement which invoked this stored function/trigger. mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(6,"Linda", "Green", "19870730", "19960104", 4322.78,"New York", "Tester");
ERROR 1442 (HY000): Can"t update table "employee" in stored function/trigger because it is already used by statement which invoked this stored function/trigger. mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(7,"David", "Larry", "19901231", "19980212", 7897.78,"New York", "Manager");
ERROR 1442 (HY000): Can"t update table "employee" in stored function/trigger because it is already used by statement which invoked this stored function/trigger. mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(8,"James", "Cat", "19960917", "20020415", 1232.78,"Vancouver", "Tester");
ERROR 1442 (HY000): Can"t update table "employee" in stored function/trigger because it is already used by statement which invoked this stored function/trigger. mysql> mysql> select * from Employee; Empty set (0.00 sec) mysql> mysql> mysql> mysql> mysql> drop trigger myTrigger; Query OK, 0 rows affected (0.01 sec) mysql> mysql> mysql> mysql> mysql> mysql> drop table Employee; Query OK, 0 rows affected (0.00 sec) mysql> mysql>
</source>
Checking NEW value and create message
<source lang="sql">
mysql> mysql> mysql> CREATE TABLE Employee(
-> id int, -> first_name VARCHAR(15), -> last_name VARCHAR(15), -> start_date DATE, -> end_date DATE, -> salary FLOAT(8,2), -> city VARCHAR(10), -> description VARCHAR(15) -> );
Query OK, 0 rows affected (0.08 sec) mysql> mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values (1,"Jason", "Martin", "19960725", "20060725", 1234.56, "Toronto", "Programmer");
Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(2,"Alison", "Mathews", "19760321", "19860221", 6661.78, "Vancouver","Tester");
Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(3,"James", "Smith", "19781212", "19900315", 6544.78, "Vancouver","Tester");
Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(4,"Celia", "Rice", "19821024", "19990421", 2344.78, "Vancouver","Manager");
Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(5,"Robert", "Black", "19840115", "19980808", 2334.78, "Vancouver","Tester");
Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(6,"Linda", "Green", "19870730", "19960104", 4322.78,"New York", "Tester");
Query OK, 1 row affected (0.01 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(7,"David", "Larry", "19901231", "19980212", 7897.78,"New York", "Manager");
Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(8,"James", "Cat", "19960917", "20020415", 1232.78,"Vancouver", "Tester");
Query OK, 1 row affected (0.00 sec) mysql> mysql> select * from Employee; +------+------------+-----------+------------+------------+---------+-----------+-------------+ | id | first_name | last_name | start_date | end_date | salary | city | description | +------+------------+-----------+------------+------------+---------+-----------+-------------+ | 1 | Jason | Martin | 1996-07-25 | 2006-07-25 | 1234.56 | Toronto | Programmer | | 2 | Alison | Mathews | 1976-03-21 | 1986-02-21 | 6661.78 | Vancouver | Tester | | 3 | James | Smith | 1978-12-12 | 1990-03-15 | 6544.78 | Vancouver | Tester | | 4 | Celia | Rice | 1982-10-24 | 1999-04-21 | 2344.78 | Vancouver | Manager | | 5 | Robert | Black | 1984-01-15 | 1998-08-08 | 2334.78 | Vancouver | Tester | | 6 | Linda | Green | 1987-07-30 | 1996-01-04 | 4322.78 | New York | Tester | | 7 | David | Larry | 1990-12-31 | 1998-02-12 | 7897.78 | New York | Manager | | 8 | James | Cat | 1996-09-17 | 2002-04-15 | 1232.78 | Vancouver | Tester | +------+------------+-----------+------------+------------+---------+-----------+-------------+ 8 rows in set (0.00 sec) mysql> mysql> mysql> mysql> delimiter $$ mysql> CREATE TRIGGER myTrigger
-> BEFORE UPDATE -> ON employee -> FOR EACH ROW -> BEGIN -> DECLARE dummy INT; -> IF NEW.salary<0 THEN -> SELECT `Account balance cannot be less than 0` INTO dummy -> FROM employee -> WHERE id=NEW.id; -> END IF; -> END$$
Query OK, 0 rows affected (0.02 sec) mysql> mysql> delimiter ; mysql> mysql> drop trigger myTrigger; Query OK, 0 rows affected (0.02 sec) mysql> mysql> mysql> mysql> update employee set salary = -1; Query OK, 8 rows affected (0.01 sec) Rows matched: 8 Changed: 8 Warnings: 0 mysql> mysql> drop table Employee; Query OK, 0 rows affected (0.00 sec) mysql> mysql> mysql>
</source>
Reference new value with NEW in a "BEFORE UPDATE"
<source lang="sql">
mysql> mysql> mysql> mysql> CREATE TABLE Employee(
-> id int, -> first_name VARCHAR(15), -> last_name VARCHAR(15), -> start_date DATE, -> end_date DATE, -> salary FLOAT(8,2), -> city VARCHAR(10), -> description VARCHAR(15) -> );
Query OK, 0 rows affected (0.01 sec) mysql> mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values (1,"Jason", "Martin", "19960725", "20060725", 1234.56, "Toronto", "Programmer");
Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(2,"Alison", "Mathews", "19760321", "19860221", 6661.78, "Vancouver","Tester");
Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(3,"James", "Smith", "19781212", "19900315", 6544.78, "Vancouver","Tester");
Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(4,"Celia", "Rice", "19821024", "19990421", 2344.78, "Vancouver","Manager");
Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(5,"Robert", "Black", "19840115", "19980808", 2334.78, "Vancouver","Tester");
Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(6,"Linda", "Green", "19870730", "19960104", 4322.78,"New York", "Tester");
Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(7,"David", "Larry", "19901231", "19980212", 7897.78,"New York", "Manager");
Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(8,"James", "Cat", "19960917", "20020415", 1232.78,"Vancouver", "Tester");
Query OK, 1 row affected (0.00 sec) mysql> mysql> select * from Employee; +------+------------+-----------+------------+------------+---------+-----------+-------------+ | id | first_name | last_name | start_date | end_date | salary | city | description | +------+------------+-----------+------------+------------+---------+-----------+-------------+ | 1 | Jason | Martin | 1996-07-25 | 2006-07-25 | 1234.56 | Toronto | Programmer | | 2 | Alison | Mathews | 1976-03-21 | 1986-02-21 | 6661.78 | Vancouver | Tester | | 3 | James | Smith | 1978-12-12 | 1990-03-15 | 6544.78 | Vancouver | Tester | | 4 | Celia | Rice | 1982-10-24 | 1999-04-21 | 2344.78 | Vancouver | Manager | | 5 | Robert | Black | 1984-01-15 | 1998-08-08 | 2334.78 | Vancouver | Tester | | 6 | Linda | Green | 1987-07-30 | 1996-01-04 | 4322.78 | New York | Tester | | 7 | David | Larry | 1990-12-31 | 1998-02-12 | 7897.78 | New York | Manager | | 8 | James | Cat | 1996-09-17 | 2002-04-15 | 1232.78 | Vancouver | Tester | +------+------------+-----------+------------+------------+---------+-----------+-------------+ 8 rows in set (0.00 sec) mysql> mysql> mysql> mysql> delimiter $$ mysql> CREATE TRIGGER myTrigger
-> BEFORE UPDATE ON employee -> FOR EACH ROW -> BEGIN -> IF NEW.salary <5000 THEN -> SET NEW.first_name=CONCAT("NEW.first_name","*"); -> ELSE -> SET NEW.last_name=CONCAT("NEW.last_name","*"); -> END IF; -> END$$
Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> mysql> update employee set salary = 1000, first_name="new first Name"; Query OK, 8 rows affected (0.01 sec) Rows matched: 8 Changed: 8 Warnings: 0 mysql> mysql> select * from employee; +------+-----------------+-----------+------------+------------+---------+-----------+-------------+ | id | first_name | last_name | start_date | end_date | salary | city | description | +------+-----------------+-----------+------------+------------+---------+-----------+-------------+ | 1 | NEW.first_name* | Martin | 1996-07-25 | 2006-07-25 | 1000.00 | Toronto | Programmer | | 2 | NEW.first_name* | Mathews | 1976-03-21 | 1986-02-21 | 1000.00 | Vancouver | Tester | | 3 | NEW.first_name* | Smith | 1978-12-12 | 1990-03-15 | 1000.00 | Vancouver | Tester | | 4 | NEW.first_name* | Rice | 1982-10-24 | 1999-04-21 | 1000.00 | Vancouver | Manager | | 5 | NEW.first_name* | Black | 1984-01-15 | 1998-08-08 | 1000.00 | Vancouver | Tester | | 6 | NEW.first_name* | Green | 1987-07-30 | 1996-01-04 | 1000.00 | New York | Tester | | 7 | NEW.first_name* | Larry | 1990-12-31 | 1998-02-12 | 1000.00 | New York | Manager | | 8 | NEW.first_name* | Cat | 1996-09-17 | 2002-04-15 | 1000.00 | Vancouver | Tester | +------+-----------------+-----------+------------+------------+---------+-----------+-------------+ 8 rows in set (0.00 sec) mysql> mysql> update employee set salary = 6000, last_name="new last Name"; Query OK, 8 rows affected (0.00 sec) Rows matched: 8 Changed: 8 Warnings: 0 mysql> mysql> select * from employee; +------+-----------------+----------------+------------+------------+---------+-----------+-------------+ | id | first_name | last_name | start_date | end_date | salary | city | description | +------+-----------------+----------------+------------+------------+---------+-----------+-------------+ | 1 | NEW.first_name* | NEW.last_name* | 1996-07-25 | 2006-07-25 | 6000.00 | Toronto | Programmer | | 2 | NEW.first_name* | NEW.last_name* | 1976-03-21 | 1986-02-21 | 6000.00 | Vancouver | Tester | | 3 | NEW.first_name* | NEW.last_name* | 1978-12-12 | 1990-03-15 | 6000.00 | Vancouver | Tester | | 4 | NEW.first_name* | NEW.last_name* | 1982-10-24 | 1999-04-21 | 6000.00 | Vancouver | Manager | | 5 | NEW.first_name* | NEW.last_name* | 1984-01-15 | 1998-08-08 | 6000.00 | Vancouver | Tester | | 6 | NEW.first_name* | NEW.last_name* | 1987-07-30 | 1996-01-04 | 6000.00 | New York | Tester | | 7 | NEW.first_name* | NEW.last_name* | 1990-12-31 | 1998-02-12 | 6000.00 | New York | Manager | | 8 | NEW.first_name* | NEW.last_name* | 1996-09-17 | 2002-04-15 | 6000.00 | Vancouver | Tester | +------+-----------------+----------------+------------+------------+---------+-----------+-------------+ 8 rows in set (0.00 sec) mysql> mysql> drop trigger myTrigger; Query OK, 0 rows affected (0.00 sec) mysql> mysql> mysql> mysql> mysql> mysql> drop table Employee; Query OK, 0 rows affected (0.00 sec) mysql> mysql>
</source>
Set NEW value to NULL in a before update trigger
<source lang="sql">
mysql> mysql> mysql> CREATE TABLE Employee(
-> id int, -> first_name VARCHAR(15), -> last_name VARCHAR(15), -> start_date DATE, -> end_date DATE, -> salary FLOAT(8,2), -> city VARCHAR(10), -> description VARCHAR(15) -> );
Query OK, 0 rows affected (0.03 sec) mysql> mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values (1,"Jason", "Martin", "19960725", "20060725", 1234.56, "Toronto", "Programmer");
Query OK, 1 row affected (0.02 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(2,"Alison", "Mathews", "19760321", "19860221", 6661.78, "Vancouver","Tester");
Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(3,"James", "Smith", "19781212", "19900315", 6544.78, "Vancouver","Tester");
Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(4,"Celia", "Rice", "19821024", "19990421", 2344.78, "Vancouver","Manager");
Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(5,"Robert", "Black", "19840115", "19980808", 2334.78, "Vancouver","Tester");
Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(6,"Linda", "Green", "19870730", "19960104", 4322.78,"New York", "Tester");
Query OK, 1 row affected (0.02 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(7,"David", "Larry", "19901231", "19980212", 7897.78,"New York", "Manager");
Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description)
-> values(8,"James", "Cat", "19960917", "20020415", 1232.78,"Vancouver", "Tester");
Query OK, 1 row affected (0.00 sec) mysql> mysql> select * from Employee; +------+------------+-----------+------------+------------+---------+-----------+-------------+ | id | first_name | last_name | start_date | end_date | salary | city | description | +------+------------+-----------+------------+------------+---------+-----------+-------------+ | 1 | Jason | Martin | 1996-07-25 | 2006-07-25 | 1234.56 | Toronto | Programmer | | 2 | Alison | Mathews | 1976-03-21 | 1986-02-21 | 6661.78 | Vancouver | Tester | | 3 | James | Smith | 1978-12-12 | 1990-03-15 | 6544.78 | Vancouver | Tester | | 4 | Celia | Rice | 1982-10-24 | 1999-04-21 | 2344.78 | Vancouver | Manager | | 5 | Robert | Black | 1984-01-15 | 1998-08-08 | 2334.78 | Vancouver | Tester | | 6 | Linda | Green | 1987-07-30 | 1996-01-04 | 4322.78 | New York | Tester | | 7 | David | Larry | 1990-12-31 | 1998-02-12 | 7897.78 | New York | Manager | | 8 | James | Cat | 1996-09-17 | 2002-04-15 | 1232.78 | Vancouver | Tester | +------+------------+-----------+------------+------------+---------+-----------+-------------+ 8 rows in set (0.00 sec) mysql> mysql> mysql> mysql> mysql> delimiter $$ mysql> mysql> CREATE TRIGGER myTrigger
-> BEFORE UPDATE ON employee FOR EACH ROW -> BEGIN -> DECLARE dummy INT; -> -> IF NEW.salary<0 THEN -> SET NEW.salary=NULL; -> END IF; -> -> END$$
Query OK, 0 rows affected (0.00 sec) mysql> mysql> delimiter ; mysql> mysql> update employee set salary = -1; Query OK, 8 rows affected (0.00 sec) Rows matched: 8 Changed: 8 Warnings: 0 mysql> mysql> drop trigger myTrigger; Query OK, 0 rows affected (0.01 sec) mysql> mysql> select * from Employee; +------+------------+-----------+------------+------------+--------+-----------+-------------+ | id | first_name | last_name | start_date | end_date | salary | city | description | +------+------------+-----------+------------+------------+--------+-----------+-------------+ | 1 | Jason | Martin | 1996-07-25 | 2006-07-25 | NULL | Toronto | Programmer | | 2 | Alison | Mathews | 1976-03-21 | 1986-02-21 | NULL | Vancouver | Tester | | 3 | James | Smith | 1978-12-12 | 1990-03-15 | NULL | Vancouver | Tester | | 4 | Celia | Rice | 1982-10-24 | 1999-04-21 | NULL | Vancouver | Manager | | 5 | Robert | Black | 1984-01-15 | 1998-08-08 | NULL | Vancouver | Tester | | 6 | Linda | Green | 1987-07-30 | 1996-01-04 | NULL | New York | Tester | | 7 | David | Larry | 1990-12-31 | 1998-02-12 | NULL | New York | Manager | | 8 | James | Cat | 1996-09-17 | 2002-04-15 | NULL | Vancouver | Tester | +------+------------+-----------+------------+------------+--------+-----------+-------------+ 8 rows in set (0.00 sec) mysql> mysql> mysql> drop table Employee; Query OK, 0 rows affected (0.00 sec) mysql> mysql> mysql>
</source>