一意のインデックスの作成について知っています。しかし、私の問題は少し異なります。同じ列の異なる状態の一意性チェックが必要です。
例えば。テーブルには Money_Transfer_status 列が含まれており、現在は保留中、進行中、承認済み、拒否済みなどがあります。
特定のユーザーに対して、進行中または保留中のステータスがある場合、そのユーザーに新しい送金を追加したくありません。それ以外の場合は問題ありません。
DBでこれを指定できる方法はありますか?
一意のインデックスの作成について知っています。しかし、私の問題は少し異なります。同じ列の異なる状態の一意性チェックが必要です。
例えば。テーブルには Money_Transfer_status 列が含まれており、現在は保留中、進行中、承認済み、拒否済みなどがあります。
特定のユーザーに対して、進行中または保留中のステータスがある場合、そのユーザーに新しい送金を追加したくありません。それ以外の場合は問題ありません。
DBでこれを指定できる方法はありますか?
テーブルに 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 が必要です。