How to create a “unique” constraint on a boolean MySQL column?

前端 未结 6 804
遥遥无期
遥遥无期 2020-12-09 08:40

I would like to add a BOOLEAN column to a MySQL table which will be named is_default. In this column, only one record can have is_default

6条回答
  •  旧巷少年郎
    2020-12-09 09:31

    Check constraints are not supported in MySQL, this is the solution using trigger:

        create table if not exists myTable (
            id int not null auto_increment primary key,
            is_default bit not null
        ) engine=innodb;
    
        select 'create trigger tbi_myTable';
        drop trigger if exists tbi_myTable;
        delimiter //
        create trigger tbi_myTable 
            before insert on myTable 
            for each row
        begin
            if (select count(1) from myTable where is_default=true) > 0 && NEW.is_default then
            -- Signal is only in 5.6 and above use another way to raise an error: if less than 5.6
                SIGNAL SQLSTATE '50000' SET MESSAGE_TEXT = 'Cannot insert into myTable only one row with is_default true is allowed!';
            end if;
        END //
        delimiter ;
    
        insert into myTable (is_default) values (false);
        insert into myTable (is_default) values (true);
        insert into myTable (is_default) values (false);
        insert into myTable (is_default) values (false);
        -- This will generate an error
        insert into myTable (is_default) values (true);
        insert into myTable (is_default) values (false);
    
    
        select * from myTable;
        -- will give
        /*
        id  is_default
        1   false
        2   true
        3   false
        4   false
        */
    

提交回复
热议问题