在单个查询中更新两个表


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) 如果您想使用一个查询根据建议更新具有相同信息的两个表。使用存储过程来同时更新它们。

4) 在这个查询中,这些帐户在什么时候相互连接?不知何故,我很好奇这个系统是测试版还是测试版?

在没有匹配特定记录的"Where"条件下,这将更新每个具有匹配ID的记录。在添加其他条件(如username=…)之前,强烈建议不要这样做。。。。或特定于某人或特定行集的条件。

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

真的不能给你一个很好的咨询,因为你把整个概述都放在胸前。使用这个简单的Jane,而不进一步详细说明你的要求,风险自负,我的朋友。

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);
}
?>

函数.pp<--如果它将是你的表单响应,就不应该被调用函数

<?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构建一个存储过程-fyi;definer是可选的。Definer将允许您运行一个查询,由于此类查询的安全性,只有提升的权限才能访问该查询。您可以使用不带definer参数的创建过程。dT只是datatype的缩写。你可以把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;

使用LEFT JOIN:

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

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

您可以尝试处理事务。BTW还请使用准备好的语句来防止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语句显式地插入。

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

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

替代解决方案

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