СНЕСК должны делать то, что вам нужно. Но в MySQL это не работает - см. Этот вопрос: CHECK constraint in MySQL is not working
Предлагаемое обходное решение - использовать триггер.
Еще одна проблема заключается в том, что вы не можете выполнить ROLLBACK в триггере, поэтому вам придется использовать другое обходное решение: вызвать несуществующую процедуру. Смотрите этот вопрос для деталей: MySQL Restrict Insert
решения для Вашего случая
От администратора командной строки выполнить:
SET GLOBAL log_bin_trust_function_creators=1;
Затем из командной строки пользователя:
delimiter $$
CREATE TRIGGER trig_price_check BEFORE INSERT ON PRODUCT
FOR EACH ROW
BEGIN
IF NEW.PRICE <= 0 AND NEW.NAME != 'TestProduct' THEN
CALL procedure_which_does_not_exist();
END IF;
END
$$
delimiter ;
Test :
mysql> INSERT INTO PRODUCT(NAME,PRICE) VALUES ('bread', 100), ('milk', 200);
Query OK, 2 rows affected (0.12 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> INSERT INTO PRODUCT(NAME,PRICE) VALUES ('apple', 300), ('banana', 0);
ERROR 1305 (42000): PROCEDURE test.procedure_which_does_not_exist does not exist
mysql> SELECT * FROM PRODUCT;
+------------+-------+-------+
| PRODUCT_ID | PRICE | NAME |
+------------+-------+-------+
| 1 | 100 | bread |
| 2 | 200 | milk |
+------------+-------+-------+
2 rows in set (0.00 sec)
Примечание: для полного решения, вы также можете добавить триггер для UPDATE
возможно дубликат [MySQL проверочное ограничение альтернативы] (http://stackoverflow.com/questions/5807231/mysql-check- ограничение-альтернатива) –
проверка этого http://dba.stackexchange.com/questions/9662/check-constraint-does-not-work это может помочь вам. –