1

私はPHPスクリプトを開発していて、次のようなテーブルがあります。

TABLE_CODE
   code  varchar  8
   name  varchar  30

このコード列は、AからZまでのランダムな文字と、0から9までの文字を使用するコードである必要があり、一意である必要があります。すべて大文字。何かのようなもの

A4RTX33Z

PHPを使用してこのコードを生成するメソッドを作成しました。ただし、先に進む前に、生成されたコードが一意であるかどうかを確認するためにデータベースにクエリを実行する必要があり、テーブルに多くのレコードが含まれている可能性があるため、これは集中的な作業です。

mySQLはトリックの袋であることは知っていますが、今はそれについての高度な知識がないので、テーブルに新しいレコードが作成されるたびにスクリプト(または何か)を実行するためにテーブルに構築できるメカニズムがあるのではないかと思います。コード列に一意の値を入力します。

ありがとう


編集:レコードがテーブルに追加され、そのコードが一意であるため、コードをオンザフライで作成する方法があるかどうか疑問に思います。

4

2 に答える 2

1

これらのコードを SQL で生成することをお勧めします。これは 8 文字のランダムな「プロモーション コード ジェネレーター」です。

INSERT IGNORE INTO 
TABLE_CODE(name, code)
VALUES(
    UPPER(SUBSTRING(MD5(RAND()) FROM 1 FOR 8)), -- random 8 characters fixed length
    'your code name'
)

@JWが提案したようにフィールドを追加UNIQUEcode、PHPでいくつかのエラー処理を追加します。生成された値がそうでない場合がありUNIQUE、MySQLはその状況でエラーを発生させるためです。

于 2013-01-21T03:28:25.083 に答える
1

コード列に UNIQUE 制約を追加することは、最初に行う必要があることです。次に、コードを挿入するために、次のような小さなループを記述します。

// INSERT IGNORE will not generate an error if the code already exists
// rather, the affected rows will be 0.
$stmt = $db->prepare('INSERT IGNORE INTO table_code (code, name) VALUES (?, ?)');
$name = 'whatever name';
do {
    $code = func_to_generate_code();
    $stmt->execute(array($code, $name));
} while (!$stmt->rowCount()); // repeat until at least one row affected

テーブルが大きくなるにつれてループの数が増える可能性があるため、3 回だけ試行する必要があると思われる場合は、それをループ条件として追加し、それが発生した場合にエラーをスローすることができます。

ところで、トランザクションを使用して、コード生成後にエラーが発生したかどうかを確認することをお勧めします。ロールバックすると、コードが削除されていることを確認できます (再利用できます)。

于 2013-01-21T03:34:03.210 に答える