mysql插入信息后并读取该信息(mysql_insert_id )
2010-04-01 10:53
267 查看
请问用mysql_insert_id 安全吗?
class表结构如下(id,className)其中id为自动增长类型的主键,className为varchar(255)字符串类型
id
className
student表结构如下(id,studentName)其中id不是自动增长类型的主键,studentName为varchr(255)字符串类型
id
student
我现在要连续插入一条数据,是这样的如下:
mysql_query ("insert into className
values(一班级')");
$id = mysql_insert_id();//获取刚刚插入的id
mysql_query ("insert
into studentName
values('张三')");
现在的问题是,mysql_insert_id();在多线程的时候,会不会获取别的页面的最后插入的id?这样就麻烦了。
回答一:
不会的
mysql_insert_id()只返回当前连接的AUTO_INCREMENT
最后产生的 ID
是以每个连接为基础在服务器端被维护的。它不可能被其它的客户端连接改变。
回答二:
它是一个单独的进程请求,所以安全!
回答三:
mysql_insert_id确实不太安全,不过不是因为线程而不安全。是因为mysql_insert_id返回的是一个int类型,如果数据库的自增字段是bigint,这个字段的数值就有可能超过int的最大值,导致结果的不正确。我是遇到过这个问题的。解决方法是利用SQL语句来获取id:SELECT
LAST_INSERT_ID()。
这个问题即使是在64位机器上也依然存在,除非bigint没用unsigned标志。因为php的int类型是用long来存储,long在32位机器是4bytes,在64位机器是8bytes。所以在32位必然存在这个问题,而在64位,因为php的int是有符号的,所以只有63个bits来存储数据。当bigint
unsigned的时候,就存在溢出的问题。
回答四:
解决方法是利用SQL语句来获取id:SELECT LAST_INSERT_ID()。
楼上的朋友,上面是您的方案,不知道
LAST_INSERT_ID()。
是php自己带的函数还是你自己写的函数,从表面上看是不是和
select max(id) from
tableName limit
1;相同呢?
如果相同的话,那您的方法也不实际啊?
必竟管理网站的不可能是一个人,这样如果多个用户操作的话,启不是会出错,
不好意思,这是我的个人意见,还请您指教!!!!!!!!!!!!!!
回答五:
LAST_INSERT_ID()是mysql提供的函数,不是PHP,也不是我提供的。
$rs=mysql_query('SELECT
LAST_INSERT_ID()');
var_dump(mysql_fetch_array($rs));
回答六:
8楼讲的不错.(指五)
LAST_INSERT_ID()是 MySQL 内部的 SQL
函数.在bigint下使用这个函数。
mysql手册中说SELECT last_insert_id()是多用户安全的。
class表结构如下(id,className)其中id为自动增长类型的主键,className为varchar(255)字符串类型
id
className
student表结构如下(id,studentName)其中id不是自动增长类型的主键,studentName为varchr(255)字符串类型
id
student
我现在要连续插入一条数据,是这样的如下:
mysql_query ("insert into className
values(一班级')");
$id = mysql_insert_id();//获取刚刚插入的id
mysql_query ("insert
into studentName
values('张三')");
现在的问题是,mysql_insert_id();在多线程的时候,会不会获取别的页面的最后插入的id?这样就麻烦了。
回答一:
不会的
mysql_insert_id()只返回当前连接的AUTO_INCREMENT
最后产生的 ID
是以每个连接为基础在服务器端被维护的。它不可能被其它的客户端连接改变。
回答二:
它是一个单独的进程请求,所以安全!
回答三:
mysql_insert_id确实不太安全,不过不是因为线程而不安全。是因为mysql_insert_id返回的是一个int类型,如果数据库的自增字段是bigint,这个字段的数值就有可能超过int的最大值,导致结果的不正确。我是遇到过这个问题的。解决方法是利用SQL语句来获取id:SELECT
LAST_INSERT_ID()。
这个问题即使是在64位机器上也依然存在,除非bigint没用unsigned标志。因为php的int类型是用long来存储,long在32位机器是4bytes,在64位机器是8bytes。所以在32位必然存在这个问题,而在64位,因为php的int是有符号的,所以只有63个bits来存储数据。当bigint
unsigned的时候,就存在溢出的问题。
回答四:
解决方法是利用SQL语句来获取id:SELECT LAST_INSERT_ID()。
楼上的朋友,上面是您的方案,不知道
LAST_INSERT_ID()。
是php自己带的函数还是你自己写的函数,从表面上看是不是和
select max(id) from
tableName limit
1;相同呢?
如果相同的话,那您的方法也不实际啊?
必竟管理网站的不可能是一个人,这样如果多个用户操作的话,启不是会出错,
不好意思,这是我的个人意见,还请您指教!!!!!!!!!!!!!!
回答五:
LAST_INSERT_ID()是mysql提供的函数,不是PHP,也不是我提供的。
$rs=mysql_query('SELECT
LAST_INSERT_ID()');
var_dump(mysql_fetch_array($rs));
回答六:
8楼讲的不错.(指五)
LAST_INSERT_ID()是 MySQL 内部的 SQL
函数.在bigint下使用这个函数。
mysql手册中说SELECT last_insert_id()是多用户安全的。
相关文章推荐
- asp.net调用mysql 存储过程 带 out 返回值,返回刚插入数据库中的自增的ID,LAST_INSERT_ID() 的使用
- mysql函数之六:mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey
- MySQL 获取最后插入的ID LAST_INSERT_ID用法
- mysql函数之六:mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey
- MySQL使用LAST_INSERT_ID()获取新插入记录的ID
- mysql_insert_id()寻找上一次插入的id
- mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey
- PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
- Mysql数据表信息插入到一个新的总数据表,总数据表id(AI自增)没有从1开始的解决
- MYSQL读取中文正常插入乱码(?)的解决和在DOS下insert,select中文的方法
- mysql通过mybatis insert数据时,返回插入数据的动态id
- 【转载】在mysql中获取insert插入数据的id的方法SELECT LAST_INSERT_ID();
- SQL Server中查找最新插入的行ID[如MySQL中的last_insert_id]
- MySQL中获取最后插入的自增ID值 LAST_INSERT_ID
- mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey
- 利用mysql_insert_id()得到最后插入自增id值
- mysql中如何取得通过insert插入或者update修改之后的id
- mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey
- asp.net调用mysql 存储过程 带 out 返回值,返回刚插入数据库中的自增的ID,LAST_INSERT_ID() 的使用