如何创建一个规则以在 bool 列中的许多假之间只接受一个真?

How to create a rule for accepting only one true between many falses in a bool column?

在一组备选方案中(一个table)一个问题(另一个table),在用户别无选择的情况下,这些备选方案之一可以是默认值。

因此,如果我有一个布尔列来设置默认选择的一组备选方案中的默认备选方案,我该如何告诉数据库(我正在使用 MariaDB ) 只允许在一组指向 questions table?

中的特定问题的备选方案中设置一个备选方案为真

示例:

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

这样的事情应该可行(如果发现任何具有真值的记录,它会引发异常):

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;//

架构设计落后。

Question table 应该说明默认值,而不是 Alternatives table。这将防止多项选择。请注意,在 Alternatives table.

中不再需要 'boolean' 列