2009-07-31 9 views
0

J'ai une application DB et maintenant nous devons commencer par la réplication (réplication maître-maître). Nous construisons une fonction stockée qui retourne un BIGINT. Cette valeur est unique sur tous les serveurs concernés.Problème mySQL et LAST_INSERT_ID

La situation: J'ai une définition de table:

create table test (
id BIGINT not null primary key auto_increment, 
col1 TEXT); 

la table a un déclencheur avant d'insérer:

CREATE TRIGGER test_insert BEFORE INSERT ON test 
FOR EACH ROW BEGIN 
    IF NEW.id = 0 THEN 
    SET @my_uuid = MYUUID(); 
    SET NEW.id = @my_uuid; 
    END IF; 
END; 

après une INSERT INTO test (col1) ("foo") J'ai besoin de la valeur de LAST_INSERT_ID() - mais j'ai seulement la valeur "0".

Je try'd cela dans la détente:

SET NEW.id = LAST_INSERT_ID(@my_uuid); 

mais ne pas le travail. J'ai lu la page de manuel mysql disant que tous les changements sur last_insert_id dans les triggers et les fonctions seront annulés à la fin du trigger.

J'essaie d'éviter de modifier l'application (witch utilisation php.last_insert_id()) ...

des idées sur la façon de résoudre ce sans changer de code php-?

grandeurs.

Répondre

1

Je suppose que vous essayez d'éviter une insertion sur les deux maîtres finissant avec le même ID. Une façon de procéder (en supposant que 2 maîtres) est de régler auto_increment_increment sur 2 et auto_increment_offset sur 0 sur un maître et 1 sur l'autre.

Cela entraînera des identifiants sur chaque maître qui ne peuvent pas entrer en collision avec l'autre. A part ça: avec un bigint et des UUID aléatoires, votre approche actuelle est susceptible d'avoir une collision autour de 3 milliards de lignes en raison du paradoxe de l'anniversaire.

0

Le comportement de LAST_INSERT_ID dans mysql par rapport aux déclencheurs est en fait assez "non standard" par rapport à la plupart des autres technologies de serveur de base de données. Mais je trouve qu'il est plus sûr et beaucoup plus facile de travailler avec.

De toute façon, il n'y a pas de réponse précise à votre question, car la réplication est toujours complexe. Mais la réponse de user83591 est suffisante pour vous donner une solution dans la plupart des cas. Notion du paradoxe de l'anniversaire est également très en place. Vous devriez accepter cela comme votre réponse.