2013-05-13 4 views
0

У меня есть таблицаMysql ограничение с условиями

CREATE TABLE PRODUCT (
PRODUCT_ID BIGINT NOT NULL AUTO_INCREMENT, 
PRICE DOUBLE NOT NULL, 
NAME VARCHAR(50) NOT NULL, 
PRIMARY KEY(PRODUCT_ID) 
); 

мне нужно ограничение, которое обеспечивает цена всегда выше, то 0, если имя не «TestProduct»

Я искал и не в состоянии найти что-нибудь подходящее

Любая идея?

+1

возможно дубликат [MySQL проверочное ограничение альтернативы] (http://stackoverflow.com/questions/5807231/mysql-check- ограничение-альтернатива) –

+0

проверка этого http://dba.stackexchange.com/questions/9662/check-constraint-does-not-work это может помочь вам. –

ответ

0

СНЕСК должны делать то, что вам нужно. Но в 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

+0

спасибо, что делает трюк – user2205623

0

Вы не указали, что должно произойти, когда ограничение значения нарушено.

вот один способ, которым Вы могли бы пойти:

CREATE TRIGGER mytrigger AFTER INSERT ON mytable 
    IF (new.NAME <> 'TestProduct' AND new.PRICE <= 0) 
     SET new.PRICE = default_price 
    END IF 
END; 
Смежные вопросы