2011-12-18 11 views
0

以下の関数を使用して、接頭辞の付いた一意のフィールドを作成しています。 これは、多くのユーザーとのトランザクションに使用されると問題を引き起こしますか? この関数はループ内で呼び出され、システムを同時に使用するユーザーが多い場合があります。私はGLAccountIDを他のテーブルの外部キーとして使用しています。mysqlフィールドの値プレフィックスの問題

function getID(){ 
    global $db; 
    $max_gl = $db->get_var("SELECT MAX(GLAccountNumber) FROM sys_glaccount"); 
    if($max_gl == null){ 
     $max_gl = 1; 
    }else if($max_gl > 0){ 
     $max_gl = $max_gl + 1; 
    } 
    return 'GLA'.$max_gl; 
} 

表はこのように見えますが、GLAccountNumberは主キーで、自動インクリメントに設定します。

enter image description here

答えて

2

は、これを行うための方法がありますが、あなたは本当にいけません。真剣に。これは重くて危険で、夜になると少し泣くでしょう。

accountNumberの使用を検討し、検索するたびにGLAを追加することをお勧めしますか?あなたがシンプルで迅速かつ正確なauto-idを持っているので、必要な時にそれをpretttifyすることができます。

もう一つの選択肢は、それが必要な理由はわかりませんが、接頭辞を1列に、数字を自動増分で組み合わせたキーにすることです。最後に

、あなたが行うすべての三個の文字を追加している場合、あなたはあなたが実際にあなたがすることなく、希望の形式のアカウントIDを取得することができ、実際に同じフィールド:)

+0

これはどのように危険ですか? –

+0

このようにして、別のユーザーが同じことを同時に実行すると、2つのaccountIDが同じですが、異なるaccountnumberを持つアカウントIDを取得します。テーブルをロックすると、処理が遅くなります。 – Nanne

1

でそれを行う必要はありません。新しい行:

SELECT CONCAT('GL',GLAccountNumber) AS GLaccountID FROM `sys_glaccount` 

だけではなく、参照する全く新しい列を作る...また

、あなたの意図は、同一のフィールドとの混同を避けるためであるならば、あなたは

を使用することができます
SELECT g.GLAccountNumber FROM `sys_glaccount` g INNER JOIN `sys_glaccount2` g2 ON g2.GLAccountNumber=g.GLAccountNumber 

クエリが固有のフィールド名なしで混乱することなく