<p>In cleaning up <a href="https://stackoverflow.com/questions/229447/how-to-create-a-two-sided-unique-index-on-two-fields#229521">this answer</a> I learnt a bit about <code>TRIGGER</code>s and stored procedures in MySQL, but was stunned that, while <code>BEFORE INSERT</code> and <code>BEFORE UPDATE</code> triggers could modify data, they seemingly couldn't cause the insert/update to fail (ie. validation). In this particular case I was able to get this to work by manipulating the data in such a way as to cause a primary key duplicate, which in this particular case made sense, but doesn't necessarily make sense in a general sense.</p>

<p>Is this sort of functionality possible in MySQL? In any other RDBMS (my experience is limited to MySQL sadly)? Perhaps a <code>THROW EXCEPTION</code> style syntax?</p>

From this
blog post
MySQL Triggers: How do you abort an INSERT, UPDATE or DELETE with a
  trigger? On EfNet’s #mysql someone
  asked:
How do I make a trigger abort the operation if my business rule fails?
In MySQL 5.0 and 5.1 you need to
  resort to some trickery to make a
  trigger fail and deliver a meaningful
  error message. The MySQL Stored
  Procedure FAQ says this about error
  handling:
SP 11. Do SPs have a “raise” statement to “raise application errors”? Sorry, not at present. The SQL standard SIGNAL and RESIGNAL statements are on the TODO.
Perhaps MySQL 5.2 will include SIGNAL
  statement which will make this hack
  stolen straight from MySQL Stored
  Procedure Programming obsolete. What
  is the hack? You’re going to force
  MySQL to attempt to use a column that
  does not exist. Ugly? Yes. Does it
  work? Sure.
```
```
CREATE TRIGGER mytabletriggerexample
BEFORE INSERT
FOR EACH ROW BEGIN
IF(NEW.important_value) < (fancy * dancy * calculation) THEN
    DECLARE dummy INT;

    SELECT Your meaningful error message goes here INTO dummy 
        FROM mytable
      WHERE mytable.id=new.id
END IF; END;
```
```