我正在使用PHP/MySQL,在打开输入屏幕时为每个条目生成计数器代码.
这是我正在使用的代码
$qresult = $db->query("SELECT count(*) FROM ap_aurora_projects");
$row = $qresult->fetch_row();
$slno = $row[0] + 1;
$today = date("ymd");
$code = $today . "-" . $slno;
Run Code Online (Sandbox Code Playgroud)
此代码正确生成并在创建记录之前向用户显示.问题是当多个用户同时打开代码在其屏幕中重复时.
什么是避免重复的方法.
我试图创建一个单独的表来存储最新的数字并为每个请求递增,但问题是,如果用户取消该条目,则该数字将丢失.
编辑
当一个用户生成代码并插入记录时,代码正常工作.但问题是如果多个用户同时打开,它会在屏幕上为它们生成相同的号码.如果所有人都试图保存记录,那么它就会重复.请注意,我生成此号码并在输入屏幕中显示最初不是在保存记录时.
我想你在问题中显示的代码是简化的,你不能按照另一个答案的建议使用AUTO_INCREMENT列.
您需要锁定表格以供阅读,直到更新为止.按以下顺序执行MySQL查询:
LOCK TABLES ap_aurora_projects READ;
SELECT count(*) FROM ap_aurora_projects WHERE ...;
//Update here ...
UNLOCK TABLES;
Run Code Online (Sandbox Code Playgroud)
有关锁定整个表的更多信息,请访问:http: //dev.mysql.com/doc/refman/5.6/en/lock-tables.html
如果您使用的是InnoDB存储引擎,可以在此处阅读有关高级(行)锁定和事务的更多信息:http: //dev.mysql.com/doc/refman/5.6/en/innodb-transaction-model.html
这是你需要做的:
首先,创建一个表:
create table uniqueId ( id bigint(20) unsigned not null auto_increment primary key );
Run Code Online (Sandbox Code Playgroud)
其次,使用此代码(我不知道您使用哪个MySQL代码,因此我将使用常见代码):
$link = mysql_connect('localhost', 'user', 'password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');
mysql_query("INSERT IGNORE INTO uniqueId VALUES (NULL);");
printf("Last inserted record has id %f\n", date("ymd") . "-" . mysql_insert_id());
Run Code Online (Sandbox Code Playgroud)
通过插入而不是选择,您确定不会有重复.
| 归档时间: |
|
| 查看次数: |
715 次 |
| 最近记录: |