mysql约束或触发器

时间:2015-09-01 12:39:23

标签: mysql sql

如何确保可以复制几行(A,B)值,但在同一个表中的行C中只能有一个对应的值?

假设我按此顺序插入这些行,这是我想要的输出。

修改 我想要的是,当第一次插入A,B,C时,C中的值将是这对夫妇唯一可能的值(A,B)

这意味着,如果i,当(A,B)中没有其他(0,0)对时,插入(0,0)C = 1,则接受该行。但是如果我添加(0,0) )第二次(第三次)时间;然后C必须等于1.

示例:

A | B | C | D | F  ...
_________________
0 | 0 |1
0 | 0 |1
0 | 0 |2 --> not allowed
1 | 0 |3 --> allowed
1 | 0 |2 --> not allowed
1 | 0 |3 --> allowed 

2 个答案:

答案 0 :(得分:2)

尝试此触发器

DELIMITER $$
CREATE TRIGGER wtf_dupes BEFORE INSERT ON your_table
FOR EACH ROW
BEGIN
    SET @ok := TRUE;

    SELECT FALSE INTO @ok FROM your_table
    WHERE 
            A = new.A 
        AND B = new.B 
        AND C <> new.C
    LIMIT 1 
    ;

    IF NOT @ok THEN
        SIGNAL SQLSTATE '23000' SET MESSAGE_TEXT = 'YourMessageAboutDupeError';
    END IF;
END $$
DELIMITER ;

关于如何捕获信号你应该自己调查: http://dev.mysql.com/doc/refman/5.5/en/signal.html#signal-effects

答案 1 :(得分:0)

虽然有办法create a trigger that checks another table or view 对于现有的价值组合,canceling insert from within a trigger in MySQL上存在一个问题,并且接受的答案表明没有此类功能。所以我认为你必须在应用程序逻辑中实现它或将插入移动到过程。