2012-09-13 101 views
0

我正在開發一個項目,其中需要我的ID列是2的冪(1,2,4,8,16..)。我知道我們不能抵消auto_increment,而是在my.cnf中進行簡單的加/減。按位計數遞增表ID字段

例子:

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_INCREMENTid,該AUTO_INCREMENT將始終返回0,從而實質上導致列上沒有變化。

我也試過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期間應用表中的值。

抓我的頭,但我相信別人有一個偉大的方式來完成這一點。

+0

當您在第一句中說「* 2倍數*」時,您的意思是「* 2 *的力量」嗎? – eggyal

+0

目前還不清楚你想要什麼樣的價值。你說你希望id是2(2,4,6,8等)的倍數,你可以使用auto_increment_increment = 2和auto_increment_offset = 2來完成。問題的標題意味着你想使用2(2,4,8,16等)的權力。但在你的例子中,你只是將所有東西都提升到第二力量(1,4,9,16)。那它是哪一個? –

+0

正確,更新的問題包括,1,2,4,8,16 ... –

回答

-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_INCREMENTid。然後我們增加1,並且功率高達2

我希望這可以幫助防止一些頭疼的人走下坡路。

+2

你爲什麼不把數值乘以2? –

+0

該觸發器不符合您的要求。我想你的意思是這樣做:'SET NEW。id = pow(2,log2((SELECT MAX(id)FROM Table))+ 1);' –

+1

@IkeWalker,它正在工作,但看看更新後的答案。這佔了前兩行要輸入到表中,以確保它不是0,並使用var來防止兩次調用「Table.id」 –