在MySQL中,使用auto_increment类型的id字段作为表的主键,并用它作为其他表的外键,形成“主从表结构”,这是数据库设计中常见的用法。但是在具体生成id的时候,我们的操作顺序一般是:先在主表中插入记录,然后获得自动生成的id,以它为基础插入从表的记录。这里面有个困难,就是插入主表记录后,如何获得它对应的id。通常的做法,是通过“select max(id) from tablename”的做法,但是显然这种做法需要考虑并发的情况,需要在事务中对主表加以“X锁“,待获得max(id)的值以后,再解锁。这种做法需要的步骤比较多,有些麻烦,而且并发性也不好。有没有更简单的做法呢?答案之一是通过select LAST_INSERT_ID()这个操作。乍一看,它和select max(id)很象,但实际上它是线程安全的。也就是说它是具体于数据库连接的。下面通过实验说明:
1、在连接1中向A表插入一条记录,A表包含一个auto_increment类型的字段。
2、在连接2中向A表再插入一条记录。
3、结果:在连接1中执行select LAST_INSERT_ID()得到的结果和连接2中执行select LAST_INSERT_ID()的结果是不同的;而在两个连接中执行select max(id)的结果是相同的。
其实在MSSQL中SCOPE_IDENTITY()和IDENT_CURRENT()的区别和这里是类似的。使用SCOPE_IDENTITY()可以获得插入某个IDENTITY字段的当前会话的值,而使用IDENT_CURRENT()会获得在某个IDENTITY字段上插入的最大值,而不区分不同的会话。
注:使用select last_insert_id()时要注意,当一次插入多条记录时,只是获得第一次插入的id值,务必注意!可以试试
insert into tb(c1,c2) values (c1value,c2value),(c1value1,c2value2)..。
最后有个问题一直没解决:
使用select last_insert_id()时要注意,当一次插入多条记录时,只是获得第一次插入的id值,务必注意。
级联批量插入,也就是一次插入多条记录,那怎么正确的获得主表每次插入的id值呢?使用auto_increment类型的id字段作为表的主键。
希望路过的高手不吝赐教,小弟不胜感激。
参考:http://www.cio360.net/h/1784/342746-2028.html
分享到:
相关推荐
在MySQL数据库系统中,处理日期和时间是常见的任务,尤其在数据分析、报表...在实际项目中,结合使用`mysql日期操作技巧.txt`的示例和`MySQL_5.1_zh.chm`的帮助文档,开发者能够高效地处理日期相关的SQL查询和编程。
在PHP与MySQL数据库交互时,有时我们需要获取刚刚插入记录的唯一标识,也就是自增ID值。这在数据库操作中非常常见,例如跟踪记录或者作为外键。本文将详细介绍三种方法来获取MySQL新增记录的ID值。 一、使用SQL查询...
总结一下,MySQL中的 `LAST_INSERT_ID()` 是一种高效且线程安全的方法,用于获取当前连接中最近插入记录的自增ID,特别适用于需要在多表操作中保持数据关联的情况。在使用时,务必注意其特性,尤其是当一次插入多行...
在 MyBatis 框架中,当我们执行一个插入(insert)操作时,有时需要获取新插入记录的自增主键值,例如数据库中的唯一标识 ID。MyBatis 提供了方便的功能来实现这一需求,这主要涉及到 `keyProperty` 和 `...
【Java代码 MySql导出到SqlLite】是一种技术实践,它涉及到使用Java编程语言来实现一个功能,该功能能够将MySQL数据库中的数据高效地导出到SQLite数据库文件中。这一过程通常用于数据迁移、备份或者在不同环境之间...
MySQL是一个广泛使用的开源关系型数据库管理系统,以其高效、稳定和易于管理的特点深受开发者喜爱。本文将深入探讨如何使用SQL语句将数据插入到MySQL数据库中,以及如何在开发者之间共享和同步数据库结构。 首先,...
比如,在插入新记录时,可以使用 `NOW()` 或 `CURRENT_TIMESTAMP()` 更新创建时间字段;如果需要追踪用户登录的时间,`CURTIME()` 可能就足够了。灵活运用这些函数,能够帮助你构建高效且精确的时间管理功能。
在MySQL数据库中,存储过程是一种预编译的SQL语句集合,可以用于执行复杂的数据库操作,如删除重复记录。在给定的存储过程`DelDuplicateRecord`中,它旨在删除具有相同标题的记录,但仅保留每个标题下最早的一条记录...
此外,由于经纬度只记录到三级,这意味着可能无法获取到乡镇或街道级别的精确位置,但足以满足大部分城市级别或区域级别的应用需求。对于需要更详细地理位置信息的场景,可能需要结合其他数据源或更高级的地图API来...
- **设计目的**:MySQL版中国省市区数据表旨在为开发者提供一个结构化且易于查询和管理的数据库模型,以便在应用中高效使用中国行政区划信息。 - **应用场景**:适用于需要频繁访问或显示中国地区信息的应用程序,如...
例如,你可以创建新表、插入数据、更新记录或执行SELECT查询。每个查询完成后,使用`mysql_free_result()`释放结果集内存。 五、结果集处理 对于SELECT查询,`mysql_store_result()`会返回一个结果集指针,你可以...
`MySqlConnection`还提供了执行SQL命令的方法,如`ExecuteNonQuery`(用于非查询操作,如插入、更新或删除)、`ExecuteReader`(用于获取数据记录)和`ExecuteScalar`(用于获取单个值,如查询结果的第一行第一列)...
1. **MySQL API**:MySQL为开发者提供了C语言的API,它是一系列函数调用,允许程序员在C程序中执行SQL语句,管理数据库连接,查询数据,插入、更新和删除记录。这些API包括`mysql_init()`用于初始化连接,`mysql_...
MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它以其高效、稳定和易于学习的特点在Web开发领域占据了重要地位。本压缩包“MySQL典型示例.zip”包含了关于MySQL的一些核心知识点,包括源文档、数据库...
这段代码将从Sheet1的第一行(A1、B1、C1单元格)获取数据,并将其插入到MySQL的"data_table"表中。根据实际需求,你需要修改SQL语句中的表名、列名以及取值范围。 在VBA中执行此宏后,数据会保存到数据库。为了将...
`语句向表中添加新记录。例如,`INSERT INTO student (idstudent, name, age, addr) VALUES (3, '王五', 21, '王家村');` - 改(UPDATE):`UPDATE table_name SET column1=value1, column2=value2 WHERE condition...
MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它以高效、稳定和灵活的特点深受开发者喜爱。在本文中,我们将深入探讨如何使用C语言来操作MySQL数据库,包括查询和各种基本操作。 首先,要使用C语言...
13. **插入记录**: - `mysql> insert into mytable values ('abccs', 'f', '1977-07-07', 'china');` 插入一条新的记录。 14. **批量导入数据**: - `mysql> Load data local infile "mytable.txt" into table ...
8.0版本带来了InnoDB存储引擎的重大提升,包括更快的插入速度、更高效的索引管理和更高的并发性能。 安装MySQL 8.0.29-Winx64时,你需要解压"mysql-8.0.29-winx64"文件夹,里面包含了所有必要的可执行文件、配置...