DELIMITER //
CREATE TRIGGER `Salary` AFTER UPDATE ON `employee`
FOR EACH ROW BEGIN
IF OLD.time_out <> NEW.time_out THEN
UPDATE employee SET time_work=TIMEDIFF(time_out,time_in);
END IF;
END;
DELIMITER ;
AND I USE THIS QUERY
UPDATE DataBase.employee SET time_out='2014-10-22 16:41:09' WHERE IDREC='4945'
THERE Error Code : 1442
Can't update table 'employee' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
You cannot update a table (employee) where the trigger is invoked:
Within a stored function or trigger, it is not permitted to modify a
table that is already being used (for reading or writing) by the
statement that invoked the function or trigger.
Doing so will generate Error 1442:
Error Code: 1442
Can't update table 'employee' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Solution: instead of AFTER UPDATE ON, make it a BEFORE UPDATE ON trigger, to set the new value for the field, before inserting - if time_work is a field in the new entry, you need to update just before insert - the probable SQL 'd be (not tested):
DELIMITER //
CREATE TRIGGER `Salary` BEFORE UPDATE ON `employee`
FOR EACH ROW BEGIN
IF OLD.time_out <> NEW.time_out THEN
SET NEW.time_work=TIMEDIFF(time_out,time_in);
END IF;
END;
DELIMITER ;
Related
I have a table named Client , I want to update the available credit column after updating the balance field.
I created this trigger
DELIMITER $$
CREATE TRIGGER client_update_balance
AFTER UPDATE ON client
FOR EACH ROW
BEGIN
update client
set AvailableCredit = CreditLimit - new.Balance;
END
But when I update a balance value like that
SET SQL_SAFE_UPDATES = 0;
UPDATE client
SET
balance = 1500
WHERE
client.ClientNum = 143;
I get this error:
Error Code: 1442. Can't update table 'client' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Checked some StackOverflow answers and tried without Update statement inside
DELIMITER $$
CREATE TRIGGER client_update_balance
AFTER UPDATE ON client
FOR EACH ROW
BEGIN
set New.AvailableCredit = New.CreditLimit - New.Balance;
END;$$
DELIMITER ;
I get another error
Error Code: 1362. Updating of NEW row is not allowed in after trigger
Use a before update trigger and just set the value:
DELIMITER $$
CREATE TRIGGER client_update_balance
BEFORE UPDATE ON client
FOR EACH ROW
BEGIN
set new.AvailableCredit = new.CreditLimit - new.Balance;
END;
The idea is that you want to change values in the same row of the table being updated. You don't need a separate update transaction to do that. You just need to adjust the values.
That said, if AvailableCredit is always defined as this difference, you should use a generated column. That way, you don't have to update the value. It is just correct when you query the table.
I want the amount to be updated if the entry is in the table else a new one inserts.
delimiter $$
CREATE TRIGGER t
BEFORE INSERT
ON PARTS
for each row
BEGIN
if exists (SELECT Part_name FROM PARTS where part_name = new.part_name) then
UPDATE PARTS SET amount=amount+NEW.amount WHERE
Part_name=NEW.Part_name;
end if;
END $$
delimiter ;
When I'm trying:
mysql> insert into PARTS(Part_name,amount,Storage_ID) values('barley',1000,1);
Then I got this error:
ERROR 1442 (HY000): Can't update table 'PARTS' in stored
function/trigger because it is already used by statement which invoked
this stored function/trigger.
What is my fault? Any idea?
You don't need a trigger. You want insert on duplicate key update:
insert into PARTS(Part_name, amount, Storage_ID)
values('barley', 1000, 1)
on duplicate key update amount = amount + values(amount);
For this to work, you need a unique index or primary key on parts(part_name). Or perhaps on parts(part_name, storage_id). It is unclear how that fits in.
I have the following trigger:
CREATE DEFINER=root#localhost TRIGGER after_insert_student AFTER INSERT ON
students FOR EACH ROW BEGIN
SET #cateID := NEW.ID ;
IF #cateID IS NOT NULL THEN
SELECT right(max(id), 3) INTO #firstid FROM students LIMIT 1;
SET #IDFOR = #firstid+1;
SET #DATEID = DATE_FORMAT(NOW(),'%y%d%m');
INSERT INTO students (CONCAT(#DATEID, #IDFOR), DATENEW)
VALUES(#IDFOR, NOW() );
END IF;
END
ERROR:
ERROR 1442: 1442: Can't update table 'students' in stored
function/trigger because it is already used by statement which invoked
this stored function/trigger.
You cannot update a table (students) where the trigger is invoked:
Within a stored function or trigger, it is not permitted to modify a
table that is already being used (for reading or writing) by the
statement that invoked the function or trigger.
Doing so will generate Error 1442:
Error Code: 1442
Can't update table 'MyTable' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
If all you need is to set the fields value based on previous entries from the same table or other (using SELECT). You can use BEFORE INSERT ON students trigger, this way you can set/update/edit the field values using the NEW operator.
Is it because you are actually doing the insert on a before insert trigger?
Wouldn't you leave the insert up to the event that fired it?
You'd be inserting another student based on the student you have just inserted in the same table
Try rewriting with an AFTER INSERT ON, and update the record you have just created instead.
The error message says all: your trigger handles before insert events on the students table and you attempt to insert a new record into the students table from the trigger. Which would set off this very trigger again, which would insert another row into the same table... Shall I go on?
Change it to an after insert trigger or using the NEW.fieldname=... syntax you can modify the inserted values.
I have the following trigger:
CREATE DEFINER=root#localhost TRIGGER after_insert_student after INSERT ON
students FOR EACH ROW BEGIN
SET #NEWID := NEW.ID ;
if #NEWID IS NOT NULL THEN
INSERT INTO students SET ID = #NEWID;
else
INSERT INTO students SET ID = 001;
END IF
END
ERROR:
Error Code: 1442. Can't update table 'students' in stored
function/trigger because it is already used by statement which
invoked this stored function/trigger.
You cannot change a table while the INSERT trigger is firing. The INSERT might do some locking which could result in a deadlock. Also, updating the table from a trigger would then cause the same trigger to fire again in an infinite recursive loop. Both of these reasons are why MySQL prevents you from doing this.
To do this, please reference this link
You probably want a BEFORE INSERT trigger. Then instead of updating the table, just assign the desired value to NEW.ID.
The problem is that you can't write statement like
INSERT INTO students SET ID = #NEWID;
because it requires to know which columns you want to insert, or if not columns specified then you insert into all columns values etc.
INSERT INTO students values (#NEWID);
should work or if you want to stick to your SET ID then try to write something like
UPDATE students SET ID = #NEWID;
Hope this guides you to solution to your problem.
Solution: make it a BEFORE UPDATE ON trigger, and use NEW operator, it'll do the job - as all you want is if new ID is NULL set it to 001:
CREATE DEFINER=root#localhost TRIGGER after_insert_student
BEFORE INSERT ON students
FOR EACH ROW BEGIN
IF NEW.ID IS NULL THEN
SET ID = 001;
END IF;
END;
Cause: You cannot update a table (students) where the trigger is invoked:
Within a stored function or trigger, it is not permitted to modify a
table that is already being used (for reading or writing) by the
statement that invoked the function or trigger.
Doing so will generate Error 1442:
Error Code: 1442
Can't update table 'chatroompost' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
My trigger fails when i try to insert a new row in my table because Mysql doesn't support updating rows in the same table the trigger is assigned to. Does anyone have suggestions on a good workaround/alternative?
My trigger:
-- Trigger DDL Statements
DELIMITER $$
CREATE TRIGGER check_sequence
BEFORE INSERT ON data FOR EACH ROW
BEGIN
IF EXISTS(SELECT TRUE FROM data WHERE sequence = NEW.sequence) THEN
UPDATE data SET sequence=sequence+1 WHERE sequence >= NEW.sequence;
END IF;
END $$
DELIMITER ;
Error Sql that is displayed when i try to insert new row:
ERROR 1442 (HY000): Can't update table 'data' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Thanks for answer,
In MySQL, You can't update (or insert in) table A in a trigger for table A.
http://dev.mysql.com/doc/refman/5.0/en/stored-program-restrictions.html
You can try a sproc and use a transaction, or consider PostgreSQL, which can do this.