【问题标题】:Sql Query using multiple inserts and multiple LAST_INSERT_ID() 's is not working [closed]使用多个插入和多个 LAST_INSERT_ID() 的 Sql Query 不起作用[关闭]
【发布时间】:2013-02-25 11:21:06
【问题描述】:

大家好,我正在尝试使用 1 个 sql 查询将问题和答案存储在 2 个表中:

INSERT INTO questions ( question, level_ID ) VALUES ( 'hello', '1'); INSERT INTO answers (questions_ID, answer, ok) VALUES (LAST_INSERT_ID(),'doei',0), (LAST_INSERT_ID(),'ciao',1); 

如果我在 SQL 框中执行 PHPMyAdmin 中的代码,它工作得很好,但如果我在我的 PHP 代码生成脚本中执行它,它会返回以下错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的 'INSERT INTO answers (questions_ID, answer, ok) VALUES (LAST_INSERT_ID(),'doei',0' 附近使用正确的语法

我看不出我做错了什么......有人吗??

提前致谢。

【问题讨论】:

  • 我的猜测是您在一次调用中执行所有查询,但您使用的库不支持多个语句。

标签: php mysql last-insert-id


【解决方案1】:

这不是 SQL 查询,而是一组查询。
PHPmyAdmin 只是拆分您的集合,然后分别执行查询。

所以你必须这样做。
一个接一个地运行它们。

不要改变任何东西。不需要额外的变量或其他任何东西。
只需在 2 个单独的连续调用中一个接一个地运行相同的查询。
就是这样。

【讨论】:

  • ...或使用mysqli::multi_query()
  • 好的,谢谢。如果我拆分查询并单独运行它们,它确实有效。但是由于我需要从 LAST_INSERT_ID() 生成的 id,所以我将查询放在一起。所以现在我可能不得不使用一个变量来存储生成的 id?
  • @ArjoPost 是的,您需要一个变量来传递给第二个 SQL。你完成了。
  • @ArjoPost - 没有任何区别,除非您关闭两个查询之间的数据库连接。
【解决方案2】:

来自the manual

生成的 ID 保存在服务器上 每个连接的基础。这意味着返回的值 给定客户端的函数是生成的第一个 AUTO_INCREMENT 值 对于影响 AUTO_INCREMENT 列的最新语句 客户。此值不会受到其他客户端的影响,即使它们 生成自己的 AUTO_INCREMENT 值。这种行为确保 每个客户端都可以检索自己的 ID 而无需担心 其他客户端的活动,并且不需要锁或 交易。

因此,您不需要将所有查询打包到 SQL 数据库调用中,只要您使用相同的连接即可。但如果您想要这样做,则需要确保您的数据库库和函数支持该功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多