2012-07-03 11 views
5

Me gustaría autoincrementar dos tablas diferentes en una sola base de datos mysql, la primera por múltiplos de 1 y la otra por 5 es posible usando la función auto_increment ya que parece que solo puedo establecer auto_increment_increment globalmente.MYSQL auto_increment_increment

Si auto_increment_increment no es una opción ¿cuál es la mejor manera de replicar esta versión actualizada

+3

tal vez usted podría agregar un campo aUTO_INCREMENT llano + un disparador que calcula el valor multiplicado y pone en el p campo de roper después de cada inserción/actualización. – biziclop

+0

Parece lo que hay que hacer si esta funcionalidad no existe, realmente pensé que sería :) Gracias –

+1

Tengo curiosidad por ¿alguna vez tendría que cambiar el intervalo de incremento? – eggyal

Respuesta

5

: sólo se utiliza una única id campo. Esto es muy probablemente no atómica, a fin de utilizar dentro de una transacción si necesita la concurrencia:

http://sqlfiddle.com/#!2/a4ed8/1

CREATE TABLE IF NOT EXISTS person (
    id INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 

CREATE TRIGGER insert_kangaroo_id BEFORE INSERT ON person FOR EACH ROW BEGIN 
    DECLARE newid INT; 

    SET newid = (SELECT AUTO_INCREMENT 
       FROM information_schema.TABLES 
       WHERE TABLE_SCHEMA = DATABASE() 
       AND TABLE_NAME = 'person' 
      ); 

    IF NEW.id AND NEW.id >= newid THEN 
    SET newid = NEW.id; 
    END IF; 

    SET NEW.id = 5 * CEILING(newid/5); 
END; 

antiguo, no trabajo "solución" (antes de insertar el gatillo no puede ver el valor actual de incremento automático):

http://sqlfiddle.com/#!2/f4f9a/1

CREATE TABLE IF NOT EXISTS person (
    secretid INT NOT NULL AUTO_INCREMENT, 
    id  INT NOT NULL, 
    PRIMARY KEY (secretid) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 

CREATE TRIGGER update_kangaroo_id BEFORE UPDATE ON person FOR EACH ROW BEGIN 
    SET NEW.id = NEW.secretid * 5; 
END; 

CREATE TRIGGER insert_kangaroo_id BEFORE INSERT ON person FOR EACH ROW BEGIN 
    SET NEW.id = NEW.secretid * 5; -- NEW.secretid is empty = unusuable! 
END; 
+0

Hola, actualicé mi respuesta, porque aceptó una solución que no funciona. – biziclop