0

ID 列を 2 の累乗にする必要があるプロジェクトに取り組んでいます ( 1,2,4,8,16..)。をオフセットすることはできませんauto_incrementが、 での単純な加算/減算が必要であることはわかっていmy.cnfます。

例:

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

私が持っていたアイデアの 1 つは、自動インクリメント機能をベースとして使用し、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、基本的に列に変化は生じません。

私も試しました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

頭を悩ませていますが、他の誰かがこれを達成する素晴らしい方法を持っていると確信しています。

4

1 に答える 1

-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ます。

これが他の人にとっての頭痛の種を防ぐのに役立つことを願っています.

于 2012-09-13T17:55:49.570 に答える