0

私は以下のコードを持っていますが、これはおそらく重複したID生成を検出し、実行されません。このコードは、IDの重複を防ぐのに十分ですか?

 //$guid and $alphabet are other sources from which id is generated
 $unique = false;
 while($unique == false){
     $Guid = NewGuid();
     ob_start();
     echo base_encode($Guid, $alphabet); 
     $newid = ob_get_contents();
     ob_get_clean();

     $query = "SELECT * FROM posts WHERE id='$newid'";
     $res = mysql_query($query) or die(mysql_error());
     if(mysql_num_rows($res) == 0) 
         $unique = true;
 }
4

2 に答える 2

4

最善のアプローチは、MySQLがauto_incrementを使用してIDを作成できるようにすることです。

CREATE TABLE table_name (
   id int(12) NOT NULL AUTO_INCREMENT,
   /* other columns... */
   PRIMARY KEY (id)
);

次に、ID列を指定せずに挿入するだけです。値を取得するには、を使用しますmysql_insert_id()

auto_incrementを使用できない正当な理由がある場合(データベースを制御できず、少なくとも10人のIT担当者から少なくとも100回も言われていない)、次の解決策は、に一意のインデックスを追加することです。列。重複を入力できなくなります。

CREATE UNIQUE INDEX index_name ON table_name (id);

これにより、重複を防ぐことができます。一意のキーに違反しているために挿入の試行が失敗した場合(エラーメッセージに表示されます)、新しいGUIDを使用して挿入を再試行できます。

衝突は非常にまれであり(ほぼ不可能)、数千万のレコード(おそらく数億)がない限り、これを最適化することを心配する必要はありません。

競合状態を回避できる他の多くの優れたオプションはありません。トランザクションで管理できますが、現在の理解レベルでは非常に注意が必要であり、上記の2つのオプションを考えると、ほとんどの場合、時間の無駄になります。

要約すると、あなたが提起した質問に対する具体的な答えは、おそらくそれを挿入してみることです。重複した場合は、新しいIDを要求して、再試行してください。ただし、ユースケースによっては、おそらくより良い戦略があります。

于 2012-04-17T18:25:47.077 に答える
0

phpには一意のIDを生成する機能があります。uniqid

DBの自動インクリメントに依存すると、コマンドとクエリの責任の分離に違反し、大規模なアプリケーションを構築するときに問題が発生する可能性があります。

于 2012-04-17T18:46:48.393 に答える