1

私は実行Coldfusion8/MySQL 5.0.88していて、0〜9のランダムな文字列であるIDを持つテーブルを持っています

テーブルに新しいレコードを作成するときにエントリの重複を避けたいのですが、正しく設定する方法がわかりません。

ここに私が持っているものがあります:

<cfset variables.listOfAppIds = "">

<!--- get all ids --->
<cfquery datasource="db" name="app_ids">
    SELECT app_id FROM apps
</cfquery>

<!--- create comma-separated list --->
<cfloop query="app_ids">
    <cfset variables.listOfAppIds = variables.listOfAppIds & "," & app_ids.app_id>
</cfloop>

<!--- create random string and test if it is in listOfAppIds --->
<cfloop condition="#ListFindNoCase(variables.listOfAppIds, variables.rndString, ',')#">
    <cfset variables.stringLength = 10>
    <cfset variables.stringList = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z">
    <cfset variables.rndString = "">
    <cfloop from="1" to="#variables.stringLength#" index="i">
        <cfset variables.rndNum = RandRange(1, listlen(variables.stringList))>
        <cfset variables.rndString = variables.rndString & listGetAt(variables.stringlist, variables.rndNum)>
    </cfloop>
    <cfset variables.current_appId = variables.rndString>
</cfloop>

質問:を正しく
使用しているかどうかわかりません。while-loopこれにより、重複が見つからないことが保証されますか?

手伝ってくれてありがとう!

4

1 に答える 1

5

アプローチを再考します。GUIDを使用しても、まったくチェックしない場合があります(多くのアプリがこれを行います)。

または、新しいランダムIDを作成してから、DBにクエリを実行して、衝突があるかどうかを確認します。そうすれば、データベースは同じロジックを処理します。その場合、ロジックは次のようになります。

collision=true;
while (collision=true) {
    newID=RandomIdFunction();
    SELECT app_id FROM apps where app_id = newID;
    if query had no rows, set collision=false;
}

データベースがいっぱいになると、衝突の可能性が高くなるため、処理速度は遅くなります。そのため、可能であればGUIDアプローチを使用することをお勧めします。

于 2012-09-24T10:06:42.693 に答える