繁体   English   中英

在单个查询中更新两个表

[英]update two table in single query

我在 sql 中有两个表,第一个表用于帐户,而第二个表用于推荐。 我正在尝试在单个查询中更新两个表。 如果帐户已经有推荐书,则更新成功,但如果帐户还没有推荐书,则更新失败。我该如何解决这个问题,这是我的更新代码....

if(!$update=mysql_query(
                "UPDATE
                     tblapplicant,
                     tbltestimonial
                 SET
                     tblapplicant.ImagePath='".$name."',
                     tbltestimonial.pic = '".$name."'
                 WHERE
                     tblapplicant.appid=tbltestimonial.appid"
            )
    )

1)您正在使用数据库,它违背了将相同数据插入到两个不同表中的目的。

2) 一位先生还提到停止使用 MySQL ... 这里有一些参考代码供您使用。 假设您使用的是 php。

3)如果您想使用单个查询根据推荐更新具有相同信息的 2 个表。 使用存储过程来更新它们。

4)这些账户在这个查询中的哪个点是相互关联的? 我有点好奇这个系统是处于测试阶段还是测试阶段?

如果您的“Where”条件不匹配特定记录,这将更新每个具有匹配 ID 的记录。 在您添加更多条件(例如 username = .... 或特定于某人或一组特定行的条件)之前,强烈不建议这样做。

**我强烈建议您发布您正在使用的表格以及您希望获得的最佳建议的结果。 **

无法真正与您在靠近胸部播放整个概述时进行很好的协商。 我的朋友,在没有进一步详细说明您要求的内容的情况下使用这个简单的简是您自己的风险。

include/dbconnect.php 可选推荐更新

<?php
if (isset($mysqli)){
    unset($mysqli);
}
define("HOST", "yo.ur.ip.addr");     // The host you want to connect to.
define("USER", "myfunctionalaccount");    // The database username. 
define("PASSWORD", "superdoopersecurepassword!");    // The database password. 
define("DATABASE", "thegoods");
$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
if ( $mysqli->connect_error ) {
    die('Connect Error: ' . $mysqli->connect_error);
}
?>

functions.php <-- 不应该被称为函数,如果它是你的表单响应

<?php
// SHOULD BE SOME MASSIVE LOGIC UP HERE FOR FORM DATA DECISIONING
include_once "include/dbconnect.php";
$name = addslashes($_FILES['image']['name']);
$image = mysql_real_escape_string(addslashes(file_get_contents($_FILES['image']['tmp_name']))); 
if ($stmt = $mysqli->prepare("CALL UpdateTestimonials(?,?,?)"){
        $stmt->bind_param($name, $image, $userid);
        $stmt->execute();
        // optional to show affected rows
        $stmt->affected_rows
        //
        // use if you want to return values from DB
        // $stmt->bind_result($result);
        // $stmt->fetch;            
}
$stmt->close
?>

MySQL构建存储过程——仅供参考; 定义器是可选的。 由于此类查询的安全性,Definer 将允许您运行只有提升权限才能访问的查询。 您可以使用不带定义器参数的创建过程。 dT 只是数据类型的缩写。 你会放 varchar 或 int ... 等等。

use 'database';
DROP procedure if exists 'UpdateTestimonials';
DELIMITER $$
use 'UpdateTestimonials' $$
CREATE DEFINER='user'@'HOSTNAME/LOCALHOST/%' PROCEDURE 'mynewprocedure' (IN varINPUT varchar, IN varIMG blob, IN varAppID int)
BEGIN
    UPDATE tblapplicant 
    SET imagepath = varINPUT,
        pic       = LOAD_FILE(varIMG)
    WHERE appid = varAppID
END $$
DELIMITER;

使用左连接:

if (!$update = mysql_query(
            "UPDATE
                 tblapplicant 
                 LEFT JOIN tbltestimonial ON tblapplicant.appid = tbltestimonial.appid
             SET
                 tblapplicant.ImagePath = '" . $name . "',
                 tbltestimonial.pic = '" . $name . "'"
        )
)

此外,如果您需要一些额外的过滤器用于 tbltestimonial,请将它们添加到 LEFT JOIN 条件中

您可以尝试进行交易。 顺便说一句,还请使用准备好的语句来防止 SQL 注入攻击。

<?php
  // prefer mysqli over mysql. It is the more modern library.
  $db = new mysqli("example.com", "user", "password", "database");

  $db->autocommit(false); // begin a new transaction

  // prepare statements
  $update_applicant = 
    $db->prepare("UPDATE tblapplicant
                  SET    tblapplicant.ImagePath = ?"));
  $update_applicant->bind_param("s", $name));
  $update_applicant->execute();

  $update_testimonial = 
    $db->prepare("UPDATE tbltestimonial
                  SET    tbltestimonial.pic = ?"));
  $update_testimonial->bind_param("s", $name))
  $update_testimonial->execute();

  $db->commit(); // finish the whole transaction as successful,
                 // when everything has succeeded.
?>

当然,这不会产生任何不存在的推荐。 它只是更新那些,那样做。 当您想在tbltestimonial插入新条目时,请在事务中使用INSERT语句显式INSERT此操作。

MySQL 不完全支持事务。 表必须使用可以处理它们的表类型,例如innodb 在这种情况下,交易将确保其他人要么看到交易中的所有更改,要么什么都不看到。

在许多情况下,事务允许您执行一组简单的步骤,否则将需要复杂的单个查询,或者根本没有事务就不可能。

替代方案

当然,另一种方法是更新触发器。 在您的数据库中创建一个触发器,它会在例如tblapplicant更新并相应地更新tbltestimonial 那么您不必在应用程序代码中关心它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM