2012-08-15 4 views
5

InnoDB MySQLテーブルのMyISAMのような動作を作成します。自動インクリメントコンポジットキーInnoDB

PRIMARY KEY(ID1、ID2)

ID1の自動増分はID2の値に基づいて

:私は複合主キーを持っていると思います。 InnoDBでこれを達成する最良の方法は何ですか?

+----------+-------------+--------------+ 
|  id1 |   id2 | other_column | 
+----------+-------------+--------------+ 
|  1 |   1 | Foo   | 
|  1 |   2 | Bar   | 
|  1 |   3 | Bam   | 
|  2 |   1 | Baz   | 
|  2 |   2 | Zam   | 
|  3 |   1 | Zoo   | 
+----------+-------------+--------------+ 
+0

何あなたは「id1の値に基づいてid1が自動的にインクリメントする場所」を意味しますか? –

+0

掲載されたデータの例を参照してください。それが私が望む行動です。 – CaptainStiggz

+0

あなたはこのようなことを達成するために多くの仕事をすることができます。それはゆっくりフレークで壊れやすいでしょう。これは2つのテーブルまたは単一の値キーでなければなりません。 –

答えて

7

あなたはゼロのid値を代入するINSERTトリガ前にこれを使用することができます -

CREATE TRIGGER trigger1 
    BEFORE INSERT 
    ON table1 
    FOR EACH ROW 
BEGIN 

    SET @id1 = NULL; 

    IF NEW.id1 = 0 THEN 
    SELECT COALESCE(MAX(id1) + 1, 1) INTO @id1 FROM table1; 
    SET NEW.id1 = @id1; 
    END IF; 

    IF NEW.id2 = 0 THEN 

    IF @id1 IS NOT NULL THEN 
     SET NEW.id2 = 1; 
    ELSE 
     SELECT COALESCE(MAX(id2) + 1, 1) INTO @id2 FROM table1 WHERE id1 = NEW.id1; 
     SET NEW.id2 = @id2; 
    END IF; 

    END IF; 

END 

次に、新しい値を生成するために、ゼロ値(ID1またはID2)を挿入 -

INSERT INTO table7 VALUES(0, 0, '1'); 
INSERT INTO table7 VALUES(0, 0, '2'); 
INSERT INTO table7 VALUES(1, 0, '3'); 
INSERT INTO table7 VALUES(1, 0, '4'); 
INSERT INTO table7 VALUES(1, 0, '5'); 
...