我知道创建唯一索引。但我的问题有点不同。我想要对同一列的不同状态进行唯一性检查。
例如。表包含列 Money_Transfer_status,现在它可以是待处理、进行中、已批准、已拒绝等。
现在对于给定的用户,如果有一个 in_progress 或 pending 状态,我不想为该用户添加新的汇款,否则应该没问题。
DB中有什么方法可以指定吗?
我知道创建唯一索引。但我的问题有点不同。我想要对同一列的不同状态进行唯一性检查。
例如。表包含列 Money_Transfer_status,现在它可以是待处理、进行中、已批准、已拒绝等。
现在对于给定的用户,如果有一个 in_progress 或 pending 状态,我不想为该用户添加新的汇款,否则应该没问题。
DB中有什么方法可以指定吗?
您必须在表上创建一个插入前触发器。
像这样的东西:
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 版