2012-03-16 5 views
8

MySQLでCHECK制約を使用したいが、サポートされていない。 (他のRDBMSと違って、それはCHECKsを理解しますが、強制はしません)MySQLトリガーはCHECK制約をシミュレートできますか?

私はトリガーでいくつかの回避策を見てきました。しかし、エラーを返すのではなく、問題のフィールドにデフォルト値を設定する傾向があります。

条件が満たされない場合にエラーを返すトリガーを構築することは可能ですか?

最終的に私はCHECK制約をコピーするトリガーが必要です。

+0

あなたの 'CHECK'制約は何ですか?チェック制約の1つの特定のタイプは、外部キー制約によってエミュレートできます。 –

+0

FK制約があなたの後でない場合、スローするためのトリガーを得ることができます。これを見て:http://stackoverflow.com/questions/24/throw-an-error-in-mysql-trigger –

+0

@ypercubeに: のようなものになる可能性があります。 ( \t id INT PRIMARY KEY (数字> 0) ); – smnsvane

答えて

2

あなたがデータを更新する際には、次の構文

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; 
7

MySQL 5.5以降では、SIGNAL構文を使用して、トリガなどのストアドプロシージャからエラーを返すことができます。

12

を試してみてください:あなたはデータを挿入する際

delimiter $$ 
create trigger chk_stats1 before update on stats 
    for each row 
    begin 
    if new.month>12 then 
     SIGNAL SQLSTATE '45000' 
     SET MESSAGE_TEXT = 'Cannot add or update row: only'; 
     end if; 
     end; 
     $$ 

delimiter $$ 
    create trigger chk_stats before insert on stats 
     for each row 
     begin 
     if new.month>12 then 
     SIGNAL SQLSTATE '45000' 
     SET MESSAGE_TEXT = 'Cannot add or update row: only'; 
     end if; 
    end; 
    $$ 

これらのトリガーはチェック制約、作品として動作します挿入または更新する前にチェックし、month> 12の場合はエラーを返します。

関連する問題