2011-12-09 7 views
1

誰かがMySQLで行制約を実装できるかどうか知っていますか?mysqlの行制約を実装する方法

私はウェブショップのためのプロモーションコードを維持するために非常に単純なテーブルを考えてみましょう:

CREATE TABLE `promotioncodes` (
    `promotionid` int(11) NOT NULL AUTO_INCREMENT, 
    `promotioncode` varchar(30) DEFAULT NULL, 
    `partnerid` int(11) DEFAULT NULL, 
    `value` double DEFAULT NULL, 
    `nr_of_usage` int(11) NOT NULL DEFAULT '0', 
    `valid_from` datetime DEFAULT '0000-00-00 00:00:00', 
    `valid_through` datetime DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`promotionid`), 
    UNIQUE KEY `promotioncode_unique` (`promotioncode`) 
) 

にどのような方法があり、行が挿入または更新されたときにことを確認しします

1 ) 'valid_from'日付は常に「より小さい」(日付の点で)、「valid_through」です。

2) 'valid_from'が空白のままになる場合、/ null 'valid_through'も空白/ヌルでなければなりません。

3) 'valid_through'を空白のままにした場合、/ null 'valid_from'を空白/ヌルにする必要があります。

私はトリガーとストアドプロシージャについていくつかのことを読んだが、これらは解決策であると感じていない。それらが解決策ならば、私にこの実装方法の具体例を教えてください

+0

ストアドプロシージャでは可能かもしれませんが、私はそれを約束できませんでした。 MySQLは、他のより堅牢なデータベースのようなものではあまり熱心ではありません。 – GordonM

答えて

1

データを挿入するストアドプロシージャを作成する必要があります。このストアドプロシージャでは、必要なルールを実装できます。

これは例です。

create procedure promotioncodes_insert(
    IN... list of params 
    OUT error_code 
) 
exec:begin 
    set error_code = 0; -- everything is ok 

    if valid_from > valid_thru then 
    set error_code = -1; -- error 
    leave exec; 
    end if; 

    if (valid_from is null) and (valid_thru is not null) then 
    set error_code = -2; -- another kind of error 
    leave exec; 
    end if; 

    -- and so on 

    -- doing insert 

end; 

insert into promocodes() values()のような直接挿入を行うと、これらの制約は機能しません。

+0

お返事ありがとうございます。しかし、私は正しいことがわかっている場合、これはストアドプロシージャによってのみ可能ですか? – Marc

+0

これは正しい方法です。また、テーブルに偽の列を追加することもできます(fake_status tinyint(1)not null)。制限付きの挿入/更新トリガーを実装します。データがあなたの制限を超えていない場合は、 'fake_status = NULL'を設定します。そうすれば、内部のアプリケーションを処理することを除いて、データはまったく挿入されません。しかし、それは完全に悪です。 – ravnur

関連する問題