How to run Trigger only on certain updates
The trigger always "runs" -- but just because it runs doesn't mean it has to perform any action.  And a trigger that doesn't perform any action doesn't take very long, if you're concerned about efficiency.  

In your case, all you need is logic to compare NEW.SellingPrice to OLD.SellingPrice and only perform the INSERT action if the two values are not the same.

Note that a common error at this step is to assume that != is the correct operator to use when comparing old and new values, but this will bite you if the column is nullable, because null values are neither equal to nor not equal to any other value, including null itself (since null is not a value, even though I myself carelessly used the phrase "null values" earlier in this same sentence).  Even if the column isn't nullable now, it is probably still a good practice to use the null-safe comparison ("spaceship") operator &lt;=&gt; and negate the result with NOT, because &lt;=&gt; expresses the actual relationship we're trying to evaluate:

DELIMITER $$

CREATE TRIGGER price_update 
    AFTER UPDATE ON Product
    FOR EACH ROW 
BEGIN
  IF NOT (NEW.SellingPrice &lt;=&gt; OLD.SellingPrice) THEN
    -- this update has changed the value of SellingPrice 
    -- for the row that invoked this run of the trigger
    INSERT INTO PriceDetails
    values(
      NEW.ProductID,
      now(),
      NEW.SellingPrice);
  END IF; 

END $$
DELIMITER ;