function randomUnique(){
return $randomString =rand(0, 9999); //generate random key
}
function insert($uid,$name,$email){
$link = mysqli_connect("localhost", "root", "", "dummy");
$query = "insert into `usertbl`(`uid`,`name`,`email`)
values('".$uid."','".$name."','".$email."');";
if(mysqli_query($link, $query)){
return $rval = 1;
}else if(mysqli_errno($link) == 1062){
insert(randomUnique(),$name,$email);
}else if(mysqli_errno($link != 1062)){
return $rval = 2;// unsuccessful query
}
}
$uid = randomUnique();
$name = "sam";
$email = "[email protected]";
$msg_code = insert ($uid,$name,$email);
echo $msg_code;
私はテーブル内の4列があります。 id
(PK AI)、uid
(varchar型のユニークな)、name
(varchar型)、email
(varchar型)を。 新しいユーザエントリを作成したいときランダムキーは関数 'randomUnique()'を使用して生成され、カラム 'id'はAIに設定されているので詳細を入力しようとしますが、エラー番号1062がmysqlから返されます。AIに設定されているidカラム以外はすべて正常に実行されます。 1つのキーが重複している場合、列の値は1回スキップされます。 上記のコードは再帰関数なので、列 'id'でスキップされた値の数は、関数が呼び出された回数に正比例します。MySQLの自動インクリメント問題
例:
id | uid | name | email
1 | 438 | dan | [email protected]
2 | 3688 | nick | [email protected]
4 | 410 | sid | [email protected]
ここでは、乱数の機能のいずれかが、私たちにエラーを投げ返す傾向があり、私たちの再帰関数は一度番号をスキップ繰り返し、数438または3688を与えたbcoz数3はスキップした見ることができます成功した実行時に3を入力して次回に4を入力します。
私はそれが適切な順序に値を入力するように、自動インクリメントを修正する必要があります。 テーブルの構造を変更することはできません。
注:IDをスキップするとどうして気になるのですか?私にはコードの匂いがする。 –
私はmariadbとmysqlの両方で自動インクリメントカウンタをインクリメントするキー制約(uniqidからのユニークでない戻り値など)に失敗していることを確信しています。 – Rogue
データベースがinnodbの場合 を参照してください。http://stackoverflow.com/questions/17668369/why-does-mysql-skip-some-auto-increment-ids https://dev.mysql.com/doc/refman /5.7/en/innodb-auto-increment-handling.html#innodb-auto-increment-configurable – Bob