Cybertech Systems
Cybertech Systems

Reputation: 13

MySQL Trigger doesnt execute if a column's default NULL value changes to some value

Here is the MYSQL Trigger that I have written:

DELIMITER //
CREATE TRIGGER updtrigger BEFORE UPDATE ON myTable
    FOR EACH ROW
    BEGIN
    IF (OLD.column IS NOT NULL AND NEW.column IS NOT NULL AND NEW.column != OLD.column) THEN 
        SET NEW.col_updated_on = NOW();
    END IF;
END //
DELIMITER ;

If column has a value (say, "movie"), and I update it to get new value, "movie,music", the trigger gets executed and col_updated_on should have the current timestamp.

However, when column is NULL and I update it to get the new value, "movie", the col_updated_on column will still show me the old timestamp.

Please let me know what change I must do to check for this condition as well.

Thanks in advance for your replies.

I have another question. Is the below pseudo possible??

Here are my two tables -
myTable(id, someId, col_updated_on); myOtherTable(id, col1, col2);

myTable.someId has a 1-on-1 relation with myOtherTable.id

I want to update myTable.col_updated_on whenever myOtherTable.col1 and myOtherTable.col2 are updated. How do i do this? and should i use "BEFORE UPDATE" or "AFTER UPDATE"?

Upvotes: 1

Views: 660

Answers (1)

eggyal
eggyal

Reputation: 125955

Use the NULL-safe equality operator:

IF NOT OLD.column <=> NEW.column THEN

However, note that MySQL's TIMESTAMP data type can (and, by default, will) automatically update whenever a record is updated, making such a trigger unnecessary.

But also, you REALLY shouldn't store multiple items in a delimited string in a relational database like MySQL. Read up on database design, especially one-to-many relationships: one would fare much better by having a separate table, in which each record links an identifier (key) from your existing (foreign) table to a single item; one would then join the tables together as required in your queries.

Upvotes: 3

Related Questions