0

一意のインデックスの作成について知っています。しかし、私の問題は少し異なります。同じ列の異なる状態の一意性チェックが必要です。

例えば。テーブルには Money_Transfer_status 列が含まれており、現在は保留中、進行中、承認済み、拒否済みなどがあります。

特定のユーザーに対して、進行中または保留中のステータスがある場合、そのユーザーに新しい送金を追加したくありません。それ以外の場合は問題ありません。

DBでこれを指定できる方法はありますか?

4

1 に答える 1

2

テーブルに before insert トリガーを作成する必要があります。

このようなもの:

DELIMITER $$
CREATE TRIGGER trigger_name BEFORE INSERT ON your_table 
FOR EACH ROW
BEGIN
IF EXISTS (SELECT 1 FROM your_table WHERE user_id = NEW.user_id AND money_trans_status = 'pending')
THEN
   SIGNAL SQLSTATE '02000'
   SET MESSAGE_TEXT = 'pending money transfer...';
END IF;
END $$

次に、挿入ステートメントが中止されます。

シグナルの詳細については、こちらをご覧ください。

編集:ただし、次のように動作することに注意する必要があります。

insert into your_table values ('valid_value'); -- succeeds as expected
insert into your_table values ('non-valid_value'); -- fails as expected

insert into your_table ('valid_value'), ('non_valid_value'), ('valid_value'); -- everything fails as one row is bad

少なくとも MySQL バージョン 5.5 が必要です。

于 2013-09-30T16:07:13.213 に答える