【问题标题】:How to run multiple insert query in SQL using PHP in one go?如何一次性使用 PHP 在 SQL 中运行多个插入查询?
【发布时间】:2018-12-19 11:18:05
【问题描述】:

我想运行 mysql 查询以从自定义 html 表单中插入数据。 在这里,我必须插入多组数据,一些数据到一个表,一些数据到另一个表。目前我正在使用简单的方法使用jquery ajax将数据发送到php页面并一个接一个地运行多个mysqli_query()函数。但是我猜当用户数量很大的时候,就会出现与速度有关的问题。所以任何人都可以建议我一个更好的方法来做同样的事情。

数据库中有5个表,每个表有7到10列,每次需要获取不同的数据集。

我只想在前一个插入查询成功完成的情况下运行每个查询。 这就是为什么我每次都检查结果然后运行下一个查询的原因,这让我感到在庞大的用户群中速度问题。

【问题讨论】:

  • 您可以将所需的所有数据传递到服务器并在单个查询中合并您的数据INSERT INTO myTable(id, anything, ...) VALUES (id, any, ...), (id2, any2, ...),(id3, any3, ...),...
  • @Nitro.de,我想将数据添加到多个表中。它不像我想在同一个表中添加多行。请给我一些好的方法来做到这一点。
  • @VikashMishra 抱歉应该更好地阅读.. 使用事务然后mysqli_begin_transaction 完成后接着mysqli_commit 或看这里stackoverflow.com/questions/5178697/…
  • 目前瓶颈在哪里?这只是一个假设的问题吗?如果出现错误,事务将有助于还原,我认为它对插入每个表的速度没有帮助。

标签: php mysql mysqli


【解决方案1】:

问题是,我需要向第一个表插入数据,如果成功插入,则只对第二个表运行查询。

这意味着您需要transaction

事务是一组查询,要么全部执行正常,要么如果一个失败 - 它们都失败。这是为了确保您的表格中不会出现垃圾数据。

不要

  • 不要使用多重查询。
  • 不要使用mysql_* 函数。
  • 不要使用批量插入。

告诉你这样做的人完全不知道他们在做什么,忽略他们。

示例代码 - 不要复制粘贴

$dsn = 'mysql:dbname=testdb;host=127.0.0.1;charset=utf8mb4';
$user = 'dbuser';
$password = 'dbpass';

$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$insert['first'] = $pdo->prepare("INSERT INTO table SET col1 = :val, col2 = :val2");
$insert['second'] = $pdo->prepare("INSERT INTO another_table SET col1 = :val, col2 = :val2"); 

$pdo->beginTransaction();

$insert['first']->bindValue(':val', 'your value');
$insert['first']->bindValue(':val2', 'anothervalue');
$insert['first']->execute();

$insert['second']->bindValue(':val', 'your value');
$insert['second']->bindValue(':val2', 'anothervalue');
$insert['second']->execute();

$pdo->commit();

仅当两次插入都成功时,上面的代码才会将数据保存在两个表中。

【讨论】:

  • @user3783243 我在哪里提到过mysqli
  • @user3783243 既然我没提过,那肯定说明这个例子适用于mysqli,OP作为程序员,可以调整do not copy paste这个例子。我更喜欢 PDO 而不是 mysqli,我用它来传递技术。它可以换成 mysqli 没有任何问题,但我只是更熟悉 PDO - 因此在示例中是 PDO。
  • @user3783243 - 所以我们都同意一切都很好,因为我们都更喜欢 PDO - 没有造成任何伤害。我们在 cmets 中添加了同样可以使用 mysqli 完成的操作。我喜欢成为大海捞针的“那个人”,但我们最终会浪费更多的字眼来描述交易。
  • 这样想,如果您经营一家汽车店,而用户说他们不喜欢 93 辛烷值的增加成本。你会建议他们用柴油代替整个发动机吗? Use PDO 声明同样具有误导性,它不是挑剔。答案是使用事务。 PDO 和 mysqli 支持它。您不需要 mysqli 示例。对主题的最终评论。
  • 有时我会很享受不和你说话。此外,您的类比完全错误。
【解决方案2】:

解释接受的答案,但强调 mysqli。

关键是配置mysqli抛出异常并使用事务。

事务将确保所有操作要么全部完成,要么没有任何效果。使用事务的另一个重要优点是它可以更快地进行多次插入,消除了可能由单独的查询执行引起的所有可能的延迟。

要在 mysqli 中使用事务,您需要执行以下操作:

首先,确保你有一个proper mysqli connection,除其他外,它告诉mysqli 在发生错误时抛出异常。然后只需准备您的查询,启动事务,执行查询并提交事务 - 就像在接受的答案中显示的那样,但使​​用 mysqli:

include 'mysqli.php';

$stmt1 = $mysqli->prepare("INSERT INTO table SET col1 = ?, col2 = ?");
$stmt2 = $mysqli->prepare("INSERT INTO another_table SET col1 = ?, col2 = ?"); 

$mysqli->begin_transaction();

$stmt1->bind_param("ss", $col1, $col2);
$stmt1->execute();

$stmt2->bind_param("ss", $col1, $col2);
$stmt2->execute();

$mysqli->commit();

由于异常和事务,无需手动验证每个查询的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多