Php 安全地获取插入行的自动增量值

Php 安全地获取插入行的自动增量值,php,mysql,synchronization,Php,Mysql,Synchronization,我在数据库中有一个表包含\u id列,该列是该表的主键,实际上该列值是通过自动增量方法设置的,是否有任何安全的方法来获取插入时自动增量值给定给行i的值???我看到一个解决方案说:“在插入查询之后立即调用mysql\u insert\u id()。”使用是否安全(即,如果同一个脚本在不同线程中,是否会得到错误的值)???如果没有,是否有任何方法可以在php中创建一个同步块?如果您的不同线程都使用各自到MySQL服务器的连接,那么应该没有问题。否则,您可能必须使用线程库提供的互斥或信号量$id=my

我在数据库中有一个表包含
\u id
列,该列是该表的主键,实际上该列值是通过自动增量方法设置的,是否有任何安全的方法来获取插入时自动增量值给定给行i的值???我看到一个解决方案说:“在插入查询之后立即调用
mysql\u insert\u id()
。”使用是否安全(即,如果同一个脚本在不同线程中,是否会得到错误的值)???如果没有,是否有任何方法可以在php中创建一个同步块?

如果您的不同线程都使用各自到MySQL服务器的连接,那么应该没有问题。否则,您可能必须使用线程库提供的互斥或信号量$id=mysql_insert_id();在查询后立即执行。

通常这样做是安全的,但可能存在同步问题

我建议将您的SQL放入事务块:

mysql_query('BEGIN TRANSACTION');

mysql_query('INSERT...');

$x = mysql_insert_id();

mysql_querry('COMMIT');

编辑:您还可以在表上放置写锁,直到读取id,然后释放锁。但是,只有在出现同步问题(同一线程)时才需要它。

据我所知,从mysql\u insert\u id返回的id是当前连接(mysql\u connect)到sql数据库的最后一次插入查询的自动增量id。必须在查询之后立即调用它的唯一原因是,如果两个insert查询紧跟在一起运行,mysql\u insert\u id只返回最后一个查询。从第一个查询中获取id是不可能的。此外,它还从上一个查询中获取id,因此如果您先插入然后更新,然后运行mysql\u insert\u id。它将返回0,因为上一个查询(更新)不是插入

另外,php只调用mysql函数。从mysql手册:

mysql_insert_id()的值仅受发出的语句的影响 在当前客户端连接中。它不受语句的影响 由其他客户签发


在PDO中,正确的方法是使用


您也可以使用单个查询来获取自动增量id,如:

INSERT INTO table_name(field_1,field_2) VALUES(:field_1,:field_2) RETURNING id;

两者都返回您的自动增量id 关于:

PHP中没有多线程,那么您关心什么呢?只要在一个连接中正确排列查询顺序和插入id()
,就可以了。请不要将注释作为答案发布。这不是注释,而是OP问题的有效答案:
使用安全吗…
INSERT INTO table_name(field_1,field_2) VALUES(:field_1,:field_2) RETURNING id;
INSERT INTO table_name (field_1) OUTPUT INSERTED.id VALUES (?);