Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免在mysql中并发插入多个相同id_Mysql - Fatal编程技术网

避免在mysql中并发插入多个相同id

避免在mysql中并发插入多个相同id,mysql,Mysql,我在申请时遇到了一个问题。我有一个表,其中一个字段名是registration\u no。在插入新记录之前,我将registration\u no字段递增1,然后将递增的registration\u no插入该表中。问题是当一些用户同时插入数据时,一些注册值不相同。如何防止这种情况发生。您可以让数据库为您设置注册号,而不是在代码中执行此操作。您可以在insert语句的结果中获得注册号,这将解决并发问题 alter table myTable modify column registration_

我在申请时遇到了一个问题。我有一个表,其中一个字段名是registration\u no。在插入新记录之前,我将registration\u no字段递增1,然后将递增的registration\u no插入该表中。问题是当一些用户同时插入数据时,一些注册值不相同。如何防止这种情况发生。

您可以让数据库为您设置注册号,而不是在代码中执行此操作。您可以在insert语句的结果中获得注册号,这将解决并发问题

alter table myTable modify column registration_no int auto_increment
查询的结果将是记录的索引如果
注册号
不是索引,您需要根据返回的索引id查询自动生成的注册号。

您想使用

两个警告:

  • 本文中描述的
    自动增量
    功能是非标准的,在移动到其他数据库时可能会带来可移植性问题

  • 如果插入被中止,序列中的一个数字仍会被消耗,因此序列中可能会出现孔。如果这是不可接受的,则对主(代理)键使用自动生成的序列,并添加从该键到“官方”序列号的单独映射,从而强制该表索引中的唯一性


另一种方法是在数据库中强制执行
唯一性
ness,使用适当的
事务隔离级别
,并添加应用程序逻辑来处理
插入失败

您必须重新编写代码以避免发生这种情况。实际上,注册在不同类别中没有不同的范围。因此,我不能给此字段自动递增,也不能给唯一,因为在不同年份可能有相同的注册号。然后您可能需要在事务中处理该注册号,并让编写该注册号的代码处理失败/获取新编号。实际上,注册号在不同类别中的范围不同。因此,我不能给出该字段的自增值,也不能给出唯一值,因为不同年份可能有相同的注册号注册号。
唯一
索引可应用于多列。