Mysql DB列中多个值的唯一性检查

Mysql DB列中多个值的唯一性检查,mysql,Mysql,我知道如何创建唯一索引。但我的问题有点不同。 我希望对同一列的不同状态进行唯一性检查 比如说。 该表包含“货币转账状态”列,现在可以是“挂起”、“进行中”、“已批准”、“已拒绝”等 现在对于一个给定的用户,如果有一个正在进行或挂起的状态,我不想为该用户添加新的转账,否则应该可以 在DB中有什么方法可以指定这一点吗?您必须在表上创建一个before insert触发器 大概是这样的: DELIMITER $$ CREATE TRIGGER trigger_name BEFORE INSERT ON

我知道如何创建唯一索引。但我的问题有点不同。 我希望对同一列的不同状态进行唯一性检查

比如说。 该表包含“货币转账状态”列,现在可以是“挂起”、“进行中”、“已批准”、“已拒绝”等

现在对于一个给定的用户,如果有一个正在进行或挂起的状态,我不想为该用户添加新的转账,否则应该可以


在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
然后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版的副本。“看!”罗斯普雷瑟,那不是复制品。引用的问题是关于作为唯一键的一部分的多个列。这个问题是关于在检查唯一性时将一列的多个值视为相同。