使用按位计数递增表ID字段

时间:2012-09-13 17:55:50

标签: mysql triggers bit-manipulation

我正在开展一个项目,我需要我的ID列是2的幂(1,2,4,8,16..)。我知道我们无法抵消auto_increment但是my.cnf中的简单加法/减法。

示例:

id
----
1
2
4
8
16
32
64
128
etc

我的一个想法是使用自动增量功能作为基础,然后创建一个触发器来应用2的幂并更新新ID,但不幸的是,它不起作用:

DELIMITER $$
CREATE TRIGGER testbitcompatid BEFORE INSERT ON Table
    FOR EACH ROW 
    BEGIN
        SET NEW.id = pow(NEW.id, 2)
    END;
$$
DELIMITER ;

由于BEFORE INSERT尚未生成AUTO_INCREMENT idAUTO_INCREMENT将始终返回0,实际上不会对列进行任何更改。< / p>

我也试过AFTER INSERT

DELIMITER $$
CREATE TRIGGER testbitcompatid AFTER INSERT ON Table
    FOR EACH ROW 
    BEGIN
        SET Table.id = pow(NEW.id, 2) WHERE id = NEW.id;
    END;
$$
DELIMITER ;

但是这失败了,因为您无法更改AFTER INSERT期间应用触发器的表的值。

抓我的头,但我相信其他人有很好的方法来实现这一目标。

1 个答案:

答案 0 :(得分:-1)

为了解决上述所有问题,我能够构建以下非常有用的内容!

DELIMITER $$
CREATE TRIGGER testbitcompatid BEFORE INSERT ON Table
    FOR EACH ROW 
    BEGIN
        SET @LAST_ROW = (SELECT MAX(id) FROM Table);
        SET NEW.id = CASE WHEN @LAST_ROW IS NULL THEN 1 ELSE @LAST_ROW * 2 END;

    END;
$$
DELIMITER ;

相当多,我们采用最高id,抓住log(2),它会为我们提供相应的AUTO_INCREMENT id。然后,我们添加1,并将其提升至2

我希望这有助于防止其他人头疼。