如何创建一个规则,在bool列中的多个falses之间只接受一个true?

时间:2016-02-16 14:33:14

标签: mysql mariadb

在问题(另一个表)的一组备选方案()中,如果用户无法选择,则其中一个备选方案可以是默认值

因此,如果我有一个布尔列来设置默认情况下要选择的一组备选项中的默认备用项,那么如何告诉数据库(我使用MariaDB )允许在一组指向questions表中特定问题的备选方案中,只有一个备选设置为true?

示例:

create table `alternatives` (
    `id`                 serial,
    `question_id`        bigint unsigned not null,
    `title`              serial,
    `default_choice`     boolean
);

insert into `alternatives` values (1, 1, "option a", false); <- ok
insert into `alternatives` values (2, 1, "option b", false); <- ok
insert into `alternatives` values (3, 1, "option c", false); <- ok
insert into `alternatives` values (4, 1, "option d", false); <- ok
insert into `alternatives` values (5, 1, "user didn't choose", TRUE); <- ok
insert into `alternatives` values (6, 1, "none of the above", true); <-- SHOULD RAISE ERROR

2 个答案:

答案 0 :(得分:1)

这样的东西应该有用(如果找到任何具有真值的记录,它会引发异常):

delimiter //
CREATE TRIGGER  check_true  BEFORE INSERT ON alternatives
    FOR EACH ROW
    BEGIN
        IF EXISTS (SELECT * FROM alternatives 
                    WHERE 
                       (question_id=NEW.question_id) 
                       AND (default_choice = true)
                       AND (NEW.default_choice = true) THEN
            SIGNAL SQLSTATE '45000';    -- code for unhandled user-defined exception
        END IF;
    END;//

答案 1 :(得分:0)

架构设计是倒退的。

Question表应该说明默认值是什么,而不是Alternatives表。这将阻止多种选择。请注意,Alternatives表中不再需要'boolean'列。