是否可以执行某些 SQL 查询而其他查询失败?

Can some SQL queries be executed while the others fail?

我从一些帖子中了解到,一个接一个地执行查询比在 PHP 文件中执行多查询功能更好。我想知道我有两个 mysqli_query 函数,是否有可能第一个查询成功并且 MySQL 数据库在下一个查询失败时已相应更改?

如果是这种情况,我只需要在第一个查询成功时才执行第二个查询,例如(创建 table,然后将数据插入 table)。在第一个查询成功的条件下放置一个 if 语句是确保这一点的最佳方法吗?

是的,这是可能的。如果您的数据库引擎支持 transactions(例如 InnoDB),那么您可以使用事务。它们使您能够隐藏更改,直到您手动调用提交。这与 multi-query.

无关

您可以在 PDO 和 mysqli 中使用事务。尽管一如既往,您应该尽可能选择 PDO。

这里是一个使用 mysqli 的简单事务的例子。整个事情都包含在 try-catch 中,因此如果其中一个查询失败,则其他查询将回滚。

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$mysqli->set_charset('utf8mb4'); // always set the charset

// start transaction
$mysqli->begin_transaction();
try {
    $stmt = $mysqli->prepare('INSERT INTO user(name) VALUE(?)');
    $stmt->bind_param('s', $username);
    $stmt->execute();
    $id = $mysqli->insert_id;

    $stmt = $mysqli->prepare('INSERT INTO hobby(uid, name) VALUE(?, ?)');
    $stmt->bind_param('ss', $id, $hobby);
    $stmt->execute();

    // save changes
    $mysqli->commit();
} catch (Throwable $e) {
    $mysqli->rollback();
    throw $e;
}

在上面的例子中,要么两个查询都成功,要么都不成功。

Create table 不能与事务一起使用,但是,因为它是一个 DDL 语句,并且它们在执行时总是会导致隐式提交。