How to use Case-When and Update in Trigger?(Error in my code)

user9296546

I tried to create below Trigger but I have an Error. Can I Use Update or use 'case when' in trigger? Please help me to fix my issue here.

Code Explanation: I want to update my existing row after insert or update. Do not change the 'FUSDate1' or 'FUSDate2' If I didn't add anything to the 'FUSDate1' or 'FUSDate2'

Update the FUSDate to the New One or Inserted one If I Updated or inserted data to FUSDate

Code:

delimiter //

create trigger SafetyCertificationTRG
after insert on SafetyCertification
for each row
begin
    case when (FUSDate1='' or FUZDate1 is NULL) then (FUZDate1=OLD.FUSDate1)  else (update SafetyCertification set FUZDate1=NEW.FUSDate1) end;
    case when (FUSDate2='' or FUZDate2 is NULL) then (FUZDate2=NEW.FUSDate2) else (update SafetyCertification set FUZDate2=NEW.FUSDate2) end;
end //

delimiter ;

Edit: I am going to add some information here to make the question more clear.

I have one column as FUS that can be get these 3 values only:('FUS1', 'FUS2' and 'FUS3') I have 3 other columns: FUSDate1, FUSDate2, FUSDate3.

I want to save the Current Date to The FUSDate1 Or FUSDate2 Or FUSDate3 based on the user User Selection of FUS. (They are in same Table)

I used the provided answer and change it to this but I cannot do the above.

Code: This code is just for FUS1 and FUSDate1

delimiter //

CREATE TRIGGER  SafetyCertification_bu
BEFORE UPDATE ON   SafetyCertification
FOR EACH ROW
BEGIN
   -- detect a change made to a value in col
   IF OLD.FUS <=> NEW.FUS THEN
      -- value of col is not changed, so do nothing
      DO 0;
   ELSE
      -- we detected a new value was assigned to col
      IF OLD.FUS ='%FUS1%' THEN
         -- we can override the new value, keep it the same
         SET NEW.FUSDate1 = CURDATE();
      END IF;
   END IF;
END //

delimiter ;

Another code that I expected to do my work but still have problem, Does not update Like above Code:

delimiter //

CREATE TRIGGER  SafetyCertification_bu
BEFORE INSERT ON   SafetyCertification
FOR EACH ROW
BEGIN
    IF NEW.FUS='%FUS1%' THEN
         SET new.FUSDate1=MD5(CURDATE());
    END IF;

END //

delimiter ;

Update 3:

The Third code that provided in answer does not add anything to the FUSdate1 and 2 and 3 when i update or insert any data.

Code

DELIMITER $$

CREATE TRIGGER  SafetyCertification_bu
BEFORE UPDATE ON   SafetyCertification
FOR EACH ROW
BEGIN
   -- set one of the `fusdateN` columns to current date
   -- which column to set depends on the value assigned to `fus` 
   IF NEW.fus = 'FUS1' THEN
      SET NEW.fusdate1 = DATE(NOW());
   ELSEIF NEW.fus = 'FUS2' THEN
      SET NEW.fusdate2 = DATE(NOW());
   ELSEIF NEW.fus = 'FUS3' THEN
      SET NEW.fusdate3 = DATE(NOW());
   END IF;
END$$

DELIMITER ;
spencer7593

A couple of notes:

A trigger cannot issue an UPDATE against the table that fired the trigger, this is prohibited.

The unqualified references (e.g. FUSDate1 and FUZDate1) are not valid. Those references don't resolve to anything.

The reference to OLD.FUSDate1 is invalid in the context of an AFTER INSERT trigger. In an UPDATE trigger, the OLD.col refers to the value of col before the update.

The expression (FUZDate1=OLD.FUSDate1) is not an assignment, it's a comparison that's going to return 0, 1 or NULL.

If we want to trigger on an UPDATE and an INSERT, that will require two separate triggers.

If we want to modify the contents of the current row, we can use BEFORE trigger instead of AFTER.


I want to update my existing row after insert or update.

It would be much easier to apply changes before the row is inserted or updated. We can assign a value to a column col by referencing NEW.col in an assignment in a BEFORE INSERT or BEFORE UPDATE trigger. For example:

 SET NEW.col = expr;

Do not change the FUSDate1 or FUSDate2 If I didn't add anything to the FUSDate1 or FUSDate2

This seems pretty straightforward. Just don't make any assignments to NEW.FUSDate1 or NEW.FUSDate2.


Update the FUSDate to the New One or Inserted one If I Updated or inserted data to FUSDate

The example proposed trigger contains references to FUZDate1 or FUZDate2, but there's no mention of these columns in the specification. The specification is confusing.

An UPDATE statement will assign a value to a column, no need for a trigger to do that. An INSERT statement can assign a value to a column, again, no need for a trigger for that.


The specification is not clear. Providing example starting state (rows in the table), and example INSERT or UPDATE statements, and the desired state after the statement is executed would go a long ways towards clarifying the requirements.

A demonstration of a BEFORE UPDATE trigger that prevents a new value being assigned to a particular column:

DELIMITER $$

CREATE TRIGGER  SafetyCertification_bu
BEFORE UPDATE ON   SafetyCertification
FOR EACH ROW
BEGIN
   -- detect a change made to a value in col
   IF OLD.col <=> NEW.col THEN
      -- value of col is not changed, so do nothing
      DO 0;
   ELSE
      -- we detected a new value was assigned to col
      IF OLD.col IS NOT NULL THEN
         -- we can override the new value, keep it the same
         SET NEW.col = OLD.col;
      END IF;
   END IF;
END$$

DELIMITER ;

For what this example trigger achieves, we don't necessarily need that many IF conditions; those are included as a demonstrate some of the checks we can perform, how we can make references to the existing value of col and the new value assigned to col.


FOLLOWUP

Based on the update information in the question, here's an example of a BEFORE UPDATE trigger that satisfies the specification.

This is for the UPDATE action. To get this same behavior with an INSERT statement, this trigger definition needs to be repeated, with BEFORE INSERT in place of BEFORE UPDATE.

(I would use the name _bu for the before update trigger, and _bi for before insert trigger.)

DELIMITER $$

CREATE TRIGGER  SafetyCertification_bu
BEFORE UPDATE ON   SafetyCertification
FOR EACH ROW
BEGIN
   -- set one of the `fusdateN` columns to current date
   -- which column to set depends on the value assigned to `fus` 
   IF NEW.fus = 'FUS1' THEN
      SET NEW.fusdate1 = DATE(NOW());
   ELSEIF NEW.fus = 'FUS2' THEN
      SET NEW.fusdate2 = DATE(NOW());
   ELSEIF NEW.fus = 'FUS3' THEN
      SET NEW.fusdate3 = DATE(NOW());
   END IF;
END$$

DELIMITER ;

second followup

To answer the question about using CASE WHEN statement in the context of a MySQL stored program...

We could implement the example trigger (directly above in this answer) replacing the IF-THEM with either of the two forms of the CASE statement.

either

   CASE 
      WHEN NEW.fus = 'FUS1' THEN
         SET NEW.fusdate1 = DATE(NOW());
      WHEN NEW.fus = 'FUS2' THEN
         SET NEW.fusdate2 = DATE(NOW());
      WHEN NEW.fus = 'FUS3' THEN
         SET NEW.fusdate3 = DATE(NOW());
   END CASE;

-or-

   CASE NEW.fus 
      WHEN 'FUS1' THEN
         SET NEW.fusdate1 = DATE(NOW());
      WHEN 'FUS2' THEN
         SET NEW.fusdate2 = DATE(NOW());
      WHEN 'FUS3' THEN
         SET NEW.fusdate3 = DATE(NOW());
   END CASE;

note

The CASE statement is available in MySQL stored programs; outside of a stored program, it is not a valid SQL statement.

Also, we should not confuse this CASE statement with the CASE expression. The CASE expression is valid in the context of a SQL statement, such as a SELECT or UPDATE statement.

DEMONSTRATION

"I examined the Trigger, But unfortunately does not save anything in fusDates."

@Christiano: here is a simple demonstration

create table

CREATE TABLE `safety_certification`
( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
, fus       VARCHAR(5)
, fusdate1  DATE
, fusdate2  DATE
, fusdate3  DATE
) ENGINE=INNODB
;

populate table with demonstration rows

INSERT INTO `safety_certification` (id, fus, fusdate1, fusdate2, fusdate3) VALUES
( 1, '', NULL, NULL, NULL)
,( 2, '', NULL, NULL, NULL)
,( 3, '', NULL, NULL, NULL)
,( 4, '', NULL, NULL, NULL)
,( 5, '', NULL, NULL, NULL)
;

create trigger

DELIMITER $$

CREATE TRIGGER  `safety_certification_bu`
BEFORE UPDATE ON   `safety_certification`
FOR EACH ROW
BEGIN
   -- set one of the `fusdateN` columns to current date
   -- which column to set depends on the value assigned to `fus`
   IF NEW.fus = 'FUS1' THEN
      SET NEW.fusdate1 = DATE(NOW());
   ELSEIF NEW.fus = 'FUS2' THEN
      SET NEW.fusdate2 = DATE(NOW());
   ELSEIF NEW.fus = 'FUS3' THEN
      SET NEW.fusdate3 = DATE(NOW());
   END IF;
END$$

DELIMITER ;

updates will exercise BEFORE UPDATE trigger we just defined

UPDATE `safety_certification` sc SET sc.fus = 'FUS1' WHERE sc.id = 1 ;
UPDATE `safety_certification` sc SET sc.fus = 'FUS2' WHERE sc.id = 2 ;
UPDATE `safety_certification` sc SET sc.fus = 'FUS3' WHERE sc.id = 3 ;
UPDATE `safety_certification` sc SET sc.fus = 'FUS4' WHERE sc.id = 4 ;

display contents of table

SELECT * FROM `safety_certification`;

returns:

    id  fus     fusdate1    fusdate2    fusdate3
------  ------  ----------  ----------  ------------
     1  FUS1    2018-05-04  (NULL)      (NULL)
     2  FUS2    (NULL)      2018-05-04  (NULL)
     3  FUS3    (NULL)      (NULL)      2018-05-04
     4  FUS4    (NULL)      (NULL)      (NULL)
     5          (NULL)      (NULL)      (NULL)

seems like the trigger is populating the columns fusdate1, fusdate2 and fusdate3 per the specification, when some particular values are assigned to fus

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

How to use case, when, in with an update query

From Dev

how to use context.getContentResolver() to execute a update with CASE WHEN statement

From Dev

'this' in javascript, how to use it in my case?

From Dev

How to use switch case in my case?

From Dev

How do I test if my MySQL update query was successful when there is no update in Code Igniter?

From Dev

How to use "position: relative" properly in my case?

From Dev

How to use join in my case Postgres query ?

From Dev

How to properly use 'didInsertElement' in my case?

From Dev

How to use join in my case Postgres query ?

From Dev

How to properly use route table in my case?

From Dev

How to use NOT EXISTS in SQL Server in my case?

From Dev

How to update my model code using LINQ

From Dev

How to update DocsList to DriveApp in my code

From Dev

How to update my model code using LINQ

From Dev

How can i update the midpoint in my code?

From Dev

Code refactoring for my case

From Dev

How to properly use CASE WHEN / THEN / ELSE with IN?

From Dev

How to use Mysql SELECT CASE WHEN expression

From Dev

CASE, WHEN, THEN on UPDATE

From Dev

How to use same form code for add,update

From Dev

How can I use Dancer2::Plugin::Database when my code is split into multiple files?

From Dev

How to reduce the use of indices in my code when working with arrays in Python 3?

From Dev

How to use CASE expression to update a table with inner queries

From Dev

How to use switch case statement and update API automatically?

From Dev

How to use toggle to shorten my code?

From Dev

How to use emacs to format my code?

From Dev

how to use first child in my code?

From Dev

How to use a defined name in an array in my code?

From Dev

how to use less mixins file in my code?

Related Related

  1. 1

    How to use case, when, in with an update query

  2. 2

    how to use context.getContentResolver() to execute a update with CASE WHEN statement

  3. 3

    'this' in javascript, how to use it in my case?

  4. 4

    How to use switch case in my case?

  5. 5

    How do I test if my MySQL update query was successful when there is no update in Code Igniter?

  6. 6

    How to use "position: relative" properly in my case?

  7. 7

    How to use join in my case Postgres query ?

  8. 8

    How to properly use 'didInsertElement' in my case?

  9. 9

    How to use join in my case Postgres query ?

  10. 10

    How to properly use route table in my case?

  11. 11

    How to use NOT EXISTS in SQL Server in my case?

  12. 12

    How to update my model code using LINQ

  13. 13

    How to update DocsList to DriveApp in my code

  14. 14

    How to update my model code using LINQ

  15. 15

    How can i update the midpoint in my code?

  16. 16

    Code refactoring for my case

  17. 17

    How to properly use CASE WHEN / THEN / ELSE with IN?

  18. 18

    How to use Mysql SELECT CASE WHEN expression

  19. 19

    CASE, WHEN, THEN on UPDATE

  20. 20

    How to use same form code for add,update

  21. 21

    How can I use Dancer2::Plugin::Database when my code is split into multiple files?

  22. 22

    How to reduce the use of indices in my code when working with arrays in Python 3?

  23. 23

    How to use CASE expression to update a table with inner queries

  24. 24

    How to use switch case statement and update API automatically?

  25. 25

    How to use toggle to shorten my code?

  26. 26

    How to use emacs to format my code?

  27. 27

    how to use first child in my code?

  28. 28

    How to use a defined name in an array in my code?

  29. 29

    how to use less mixins file in my code?

HotTag

Archive