2009-07-31 15 views
0

私はDBアプリケーションを持っており、今はレプリケーション(master-master-replication)から始める必要があります。 ストアドファンクションウィッチを構築すると、BIGINTが返されます。この値は、関連するすべてのサーバーで一意です。mySQLとLAST_INSERT_IDの問題

状況: 私はテーブル定義を持っている:テスト(COL1)の値( "foo" という)への挿入後に

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; 

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

の表は、挿入トリガーの前にあり私はLAST_INSERT_ID()の値が必要です - しかし、私は値 "0"を取得します。

私はトリガーでこれをtry'd:

SET NEW.id = LAST_INSERT_ID(@my_uuid); 

が、それは仕事をドント。

私は、トリガーと関数内のlast_insert_idのすべての変更がトリガーの終了時にキャンセルされるというmysqlのマンページを読んでいます。

だから私は、アプリケーションの変更を回避しようとする(魔女利用php.last_insert_idを())...

任意のアイデアをどのようにPHPのコードを変更せずにこの問題を解決するには?

greatings。

答えて

1

同じIDで終わる2つのマスターに挿入しないようにしようとしています。

auto_increment_incrementを2に設定し、1つのマスターでauto_increment_offsetを0に設定し、もう一方のマスターを1に設定する方法があります(2マスターを想定)。

これにより、各マスター上で、他のものと衝突することのできないIDが発生します。

ほか:bigintとランダムなUUIDを使用すると、誕生日パラドックスのために、現在のアプローチで約30億行の衝突が発生する可能性があります。

0

トリガーとの関係でmysqlのLAST_INSERT_IDの動作は、他のほとんどのデータベースサーバーテクノロジと比較すると、実際には「標準外」です。しかし、私はそれがより安全で、作業がはるかに容易であることがわかりました。

とにかく、複写は常に複雑であるため、疑問の答えはありません。しかし、user83591という答えは、ほとんどの場合、あなたに解決策を提供するのに十分です。誕生日のパラドックスの概念も非常に適切です。あなたはあなたの答えとしてそれを受け入れるべきです。