三种回到mysql,mysql插入数据后归来自增ID的方法

两种回到mysql教程 插入一条记下再次来到该记录id方法

mysql插入数据后回到自增ID的诀窍

Mysql中LAST_INSERT_ID()的函数使用详解,mysqllastinsertid

不久前和Sobin在做一个精品课程的项目,因为用到四个固定的id作为表间关联,所以在前叁个表插入数据后要把插入数据变动的自增id传递给下多少个表。钻探了一番调整利用Mysql提供了二个LAST_INSERT_ID()的函数。

复制代码 代码如下:
LAST_INSERT_ID() (with no argument) returns the first automatically
generated value that was set for an AUTO_INCREMENT column by the most
recently executed INSERT or UPDATE statement to affect such a column.
For example, after inserting a row that generates an AUTO_INCREMENT
value, you can get the value like this:
mysql> SELECT LAST_INSERT_ID();
-> 195

大致说来,正是以此函数将赶回插入的那条记下在表中自增的极度字段的值,一般大家都给这么些自增字段命名称叫ID。这样就可以回去刚插入的笔录的ID值了。

三个归纳的例子:

复制代码 代码如下:
$query=”INSERT INTO `testtable` (`clou1`,`clou2`) VALUES
(‘testvalue’,’test’)”;
mysql_query($query);
$query=”SELECT LAST_INSERT_ID()”;
$result=mysql_query($query);
$rows=mysql_fetch_row($result);
echo $rows[0];

以此函数是依靠connection的,相当于不会被别的客户端的connection影响到,所以结果是准确的。如若利用select
max(id) from table,在高密度的插入乞求下,是有异常的大概率出题指标,重回错误值

LAST_INSERT_ID说明

从名字能够见到,LAST_INSERT_ID即为最终插入的ID值,依照MySQL的合法手册表明,它有2种采用办法

一是不带参数:LAST_INSERT_ID(),这种办法和AUTO_INCREMENT属性一齐使用,当往带有‘AUTO_INCREMENT’属性字段的表中新扩展记录时,LAST_INSERT_ID()即重返该字段的值,大家可试下(笔者已经表明过);
二是含有表明式:如上边介绍的LAST_INSERT_ID(value+1),它回到的是表明式的值,即‘value+1’;
##################################
LAST_INSERT_ID() 自动重回最终叁个INSERT或 UPDATE 查询中
AUTO_INCREMENT列设置的首先个表爆发的值。

MySQL的LAST_INSERT_ID的注意事项:

率先、查询和插入所选取的Connection对象必须是同一个才方可,不然重回值是不足预料的。

mysql> SELECT LAST_INSERT_ID();

        -> 100

运用那函数向一个给定Connection对象回来的值是该Connection对象发生对影响AUTO_INCREMENT列的风行讲话第一个AUTO_INCREMENT值的。那几个值无法被其余Connection对象的影响,即它们发出它们本身的AUTO_INCREMENT值。

第二、LAST_INSERT_ID
是与table非亲非故的,如若向表a插入数据后,再向表b插入数据,LAST_INSERT_ID返回表b中的Id值。

其三、 要是你使用一条INSERT语句插入多少个行,  LAST_INSERT_ID()
只回去插入的率先行数据时发出的值。其缘由是那使依赖任何服务器复制同样的
INSERT语句变得简单。

mysql> INSERT INTO t VALUES

    -> (NULL, ‘Mary’), (NULL, ‘Jane’), (NULL, ‘Lisa’);

mysql> SELECT * FROM t;

| id | name |

+—-+——+

|  1 | Bob  |

|  2 | Mary |

|  3 | Jane |

|  4 | Lisa |

mysql> SELECT LAST_INSERT_ID();  //那就是本人要申明的关键问题。

| LAST_INSERT_ID() |

|                2 |

虽说将3 个新行插入 t, 对那些行的率先行产生的 ID 为 2, 那也是
LAST_INSERT_ID()重回的值。

如上所述正是本文的全体内容了,希望大家能够欣赏。

请你花一点时光将稿子分享给您的对象或然留下研讨。大家将会由衷多谢您的支撑!

近来和Sobin在做八个精品课程的项目,因为用到一个定点的id作为表间关联,所以在前二个…

mysql教程 LAST_INSERT_ID() mysql_insert_id
获取insert数据的主键值自动编号

方法一

 

大家讲了关于mysql LAST_INSERT_ID() mysql_insert_id
获取insert数据的主键值自动编号那么来解析一下它们的区分呢
 mysql_insert_id
()是直接获得当前session的insert_id,而LAST_三种回到mysql,mysql插入数据后归来自增ID的方法。INSERT_ID()是SQL函数,必要经超过实际行SQL来赚取,如:SELECT
LAST_INSERT_ID();显著那多个效果与利益是大同小异的,但实行叁遍SQL要消耗点不清财富,比不上直接通过mysql_insert_id()得到内部存款和储蓄器中的值快得多
 

id int(11) not null pri key auto_increment,name
varchar(12),backup varchar(50)
明天想插入一条记下的还要,重回她的id值(插入时只是插入name和backup字段的值)。请问该怎么写那条语句。多谢!

mysql和oracle插入的时候有多少个比极大的区分是,oracle帮助连串做id,mysql自己有三个列能够做自增进字段,mysql在插入一条数据后,怎样能获得到这几个自增id的值吗?

$tablename =’test’;
$conn = mysql_connect(‘127.0.0.1′,’root’,’12346′);

您的顾忌完全多于。 没有供给锁表, 再次来到的ID明确是您的,基于当前连接session

 

$result = mysql_query ( ‘UPDATE ‘ . $tablename . ‘ SET
id=LAST_INSERT_ID(id+1)’, $conn ); 
 if ($result === false) {
  mysql_query ( ‘CREATE TABLE ‘ . $tablename . ‘ (id INT NOT NULL)’,
$dbh );
 $rs = mysql_query ( ‘SELECT COUNT(*) FROM ‘ . $tablename . ‘ LIMIT
1’, $dbh ); 
 if (mysql_result ( $rs, 0 ) == 0) {
   mysql_query ( ‘INSERT INTO ‘ . $tablename . ‘ VALUES (‘ .
($start_index – 1) . ‘)’, $dbh );
 } 
 mysql_query ( ‘UPDATE ‘ . $tablename . ‘ SET
id=LAST_INSERT_ID(id+1)’, $dbh ); 
 } 
$return = mysql_insert_id ( $dbh );

电动重临最终三个INSERT或 UPDATE 问询为 AUTO_INCREMENT列设置的率先个
爆发的值。

格局一是利用last_insert_id

//上边接着来看叁个last_inert_id实例

mysql> SELECT LAST_INSERT_ID();

 

$sql=”insert into table (name1,name2,…)
values(‘www.bKjia.c0m’,’bKjia.c0m’…)”;

        -> 195

1

mysql_query($conn,$sql);
//寻找最后二遍插入记录的id
$select=”select last_insert_id() “;
$result=mysql_query($db_link,$select);
$rs = mysql_fetch_array( $result );
$last_id=$rs[0];

发生的ID
每趟延续后保存在服务器中。那意味函数向二个给定客户端重临的值是该客户端发生对影响AUTO_INCREMENT列的风行讲话第多少个AUTO_INCREMENT值的。这么些值不可能被其它客户端影响,纵然它们发出它们自个儿的
AUTO_INCREMENT值。那一个行为保障了您可见找回本人的 ID
而不用忧郁其余客户端的运动,而且不要求加锁或拍卖。
 

mysql> SELECT LAST_INSERT_ID();

//再来看八个官方的实例

mysql的源代码里面,mysql_insert_id是那般定义的
my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql)
{
  return mysql->;last_used_con->;insert_id;
}

    发生的ID
每一遍一而再后保存在服务器中。那意味函数向一个给定客户端重临的值是该客户端产生对影响AUTO_INCREMENT列的风行讲话第一个AUTO_INCREMENT值的。那么些值不可能被其余客户端影响,即便它们发出它们本人的
AUTO_INCREMENT值。那一个行为保障了您可见找回自身的 ID
而不用担心其余客户端的运动,而且无需加锁或拍卖。 

mysql> USE test;
Database changed
mysql> CREATE TABLE t (
    ->   id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    ->   name VARCHAR(10) NOT NULL
    -> );
Query OK, 0 rows affected (0.09 sec)

MYSQL提必要c++,php教程等的API一般,有个MYSQL结构体。
结构体里面有insert_id, insert_id的类型 my_ulonglong。 其实就是long
long.

 

mysql> INSERT INTO t VALUES (NULL, ‘Bob’);
Query OK, 1 row affected (0.01 sec)

每次mysql_query操作在mysql服务器上能够知晓为三次“原子”操作,
数据库教程的写操作常常必要锁表的,
是mysql应用服务器锁表不是大家的应用程序锁表。

    每次mysql_query操作在mysql服务器上能够领略为一遍“原子”操作,
写操作平日要求锁表的, 是mysql应用服务器锁表不是大家的应用程序锁表。

mysql> SELECT * FROM t;
+—-+——+
| id | name |
+—-+——+
|  1 | Bob  |
+—-+——+
1 row in set (0.01 sec)

 

 

mysql> SELECT LAST_INSERT_ID();
+——————+
| LAST_INSERT_ID() |
+——————+
|                1 |
+——————+
1 row in set (0.00 sec)

方法二

   
值得注意的是,倘令你壹次插入了多条记下,那一个函数再次回到的是第三个记录的ID值。

mysql> INSERT INTO t VALUES
    -> (NULL, ‘Mary’), (NULL, ‘Jane’), (NULL, ‘Lisa’);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

Mysql提供了多少个LAST_INSERT_ID()的函数。

 

mysql> SELECT * FROM t;
+—-+——+
| id | name |
+—-+——+
|  1 | Bob  |
|  2 | Mary |
|  3 | Jane |
|  4 | Lisa |
+—-+——+
4 rows in set (0.01 sec)

LAST_INSERT_ID() (with no argument) returns the first automatically
generated value that was set for an AUTO_INCREMENT column by the most
recently executed INSERT or UPDATE statement to affect such a column.
For example, after inserting a row that generates an AUTO_INCREMENT
value, you can get the value like this:

   
因为LAST_INSERT_ID是依附Connection的,只要每一种线程都采纳独立的Connection对象,LAST_INSERT_ID函数将回来该Connection对AUTO_INCREMENT列最新的insert
or
update*作生成的率先个record的ID。这一个值不可能被别的客户端(Connection)影响,保障了你能够找回本人的
ID
而不用思念别的客户端的移动,而且无需加锁。使用单INSERT语句插入多条记下,
 LAST_INSERT_ID重回多个列表。

mysql> SELECT LAST_INSERT_ID();
+——————+
| LAST_INSERT_ID() |
+——————+
|                2 |
+——————+
1 row in set (0.00 sec)

mysql> SELECT LAST_INSERT_ID();
        ->
195简易说来,就是以此函数将回到插入的那条记下在表中自增的非常字段的值,一般我们都给那一个自增字段命名称叫ID。那样就足以回到刚插入的笔录的ID值了。

 

 

三个简便的事例:

    LAST_INSERT_ID
是与table非亲非故的,假若向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。

总结

$query=”INSERT INTO `testtable` (`clou1`,`clou2`) VALUES
(‘testvalue’,’test’)”;
mysql_query($query);
$query=”SELECT LAST_INSERT_ID()”;
$result=mysql_query($query);
$rows=mysql_fetch_row($result);
echo $rows[0];那样就能够回到刚插入的笔录的ID值了。
值得注意的是,倘若你壹回插入了多条记下,那么些函数再次来到的是首先个记录的ID值。

 

mysql_insert_id() 将 MySQL 内部的 C API 函数 mysql_insert_id()
的再次来到值调换到 long(PHP 中命名称叫 int)。假设 AUTO_INCREMENT
的列的等级次序是 BIGINT,则 mysql_insert_id() 重临的值将不得法。能够在 SQL
查询中用 MySQL 内部的 SQL 函数 LAST_INSERT_ID() 来替代。

mysql> INSERT INTO t VALUES
    -> (NULL, ‘Mary’), (NULL, ‘Jane’), (NULL, ‘Lisa’);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

措施二是应用max(id)

本站原创转发表明来源www.bKjia.c0m

mysql> SELECT * FROM t;
+—-+——+
| id | name |
+—-+——+
|  1 | Bob  |
|  2 | Mary |
|  3 | Jane |
|  4 | Lisa |
+—-+——+
4 rows in set (0.01 sec)

 

LAST_INSERT_ID() mysql_insert_id
获取insert数据的主键值自动编号 咱们讲了有关mysql LAST_INSERT_ID()
mysql_insert_id 获取insert数据的主键值自动编…

mysql> SELECT LAST_INSERT_ID();
+——————+
| LAST_INSERT_ID() |
+——————+
|                2 |
+——————+
1 row in set (0.00
sec)那些函数是依据connection的,也正是不会被其余客户端的connection影响到,所以结果是标准的。假设运用select
max(id) from table,在高密度的插入央求下,是有望出标题标,重临错误值。

使用last_insert_id是基础连接的,要是换叁个窗口的时候调用则会间接重临10

方法三

 

.select max(id) from user;
2.select last_insert_id() as id from user limit 1; 
(那么些测量试验的归来id一贯是0,有一些难点)
3.仓库储存进度
1)
oracel中
create sequence seqID
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
nocache
order;
create or replace procedure sp_insert(aName int,rst out int) is
begin
  insert into tablename(id,name) values(seqID.nextval,aName);
  rst:=seqID.currval;
end;
2)mysql中实现
DELIMITER $$
DROP PROCEDURE IF EXISTS `test` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(in name
varchar(100),out oid int)
BEGIN
  insert into user(loginname) values(name);
  select max(id) from user into oid;
  select oid;
END $$
997755.com澳门葡京,DELIMITER ;
接下来实施
call test(‘gg’,@id);
就返回id ……

假定不是数十二回的插入大家也可以选择这种方法来赢得再次回到的id值

插入一条记下再次回到该记录id方法
方法一 id int(11) not null pri key auto_increment,name
varchar(12),backup varchar(50) 未来想插…

 

1

select max(id) from user;

本条点子的老毛病是不符合高并发。借使同一时候插入的时候回来的值或许不正确。

 

方法三是创立二个存款和储蓄进程,在积累进程中调用先插入再获得最大值的操作

 

1

DELIMITER $$

2

DROP PROCEDURE IF EXISTS `test` $$

3

CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(in name
varchar(100),out oid int)

4

BEGIN

5

  insert into user(loginname) values(name);

6

  select max(id) from user into oid;

7

  select oid;

8

END $$

9

DELIMITER ;

1

call test(‘gg’,@id);

办法四应用@@identity

 

 

1

select @@IDENTITY

   
@@identity是表示的是近年二次向具备identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。一般系统定义的全局变量都是以@@起头,用户自定义变量以@开首。举个例子有个表A,它的自增列是id,当向A表插入一行数据后,假设插入数据后自增列的值自动扩张至101,则经过select
@@identity获得的值就是101。使用@@identity的前提是在展开insert操作后,实践select
@@identity的时候总是未有关闭,不然获得的将是NULL值。

艺术五是选拔getGeneratedKeys()

 

01

Connection conn = ;

02

 

03

Serializable ret = null;

04

PreparedStatement state = .;

05

ResultSet rs=null;

06

try {

07

    state.executeUpdate();

08

    rs = state.getGeneratedKeys();

09

    if (rs.next()) {

10

        ret = (Serializable) rs.getObject(1);

11

    }     

12

} catch (SQLException e) {

13

}

14

return ret;

小结一下,在mysql中做完插入之后拿到id在高并发的时候是很轻便出错的。此外last_insert_id尽管是依赖session的只是不明了怎么未有测量检验成功。

 

实质上在ibtias框架里选拔selectkey那几个节点,并安装insert重返值的类别为integer,就足以再次回到这么些id值。

 

mysql和oracle插入的时候有一个异常的大的分别是,oracle支持类别做id,mysql自个儿有二个列能够做自增进字段,m…

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website