2012-08-15 24 views
5

Quiero crear un comportamiento similar al de MyISAM para una tabla InnoDB MySQL. Quiero tener una clave compuesta primaria:Aumento automático de la clave compuesta InnoDB

PRIMARY KEY (id1, id2)

Dónde incrementos de automóviles ID1 basan en el valor de id2. ¿Cuál es la mejor manera de lograr esto con InnoDB?

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

Lo ¿te refieres a "Donde id1 se incrementa automáticamente según el valor de id2"? –

+0

Ver los datos de ejemplo publicados. Ese es el comportamiento que quiero. – CaptainStiggz

+0

Podría hacer un montón de trabajo para lograr algo como esto. Sería lento, escamoso y frágil. Esto debería ser dos tablas o una sola clave de valor. –

Respuesta

7

Puede utilizar esta ANTES desencadenador INSERT para sustituir id-valores cero -

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 

A continuación, introduzca cero-valores (ID1 o ID2) para generar nuevos valores -

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'); 
... 
Cuestiones relacionadas