【问题标题】:New and old values in postgresql phppostgresql php中的新旧值
【发布时间】:2018-11-06 20:47:38
【问题描述】:

我有一张包含大量数据的表格。在此表中,我想添加新值和更新旧值。因此,我找到了以下方法

从响应中调整查询后,我仍然收到错误。

Fatal error: Uncaught PDOException: SQLSTATE[42702]: Ambiguous column: 7 
ERROR: column reference "id" is ambiguous LINE 3: ...richia coli',full_name = 
'Escherichia coli' WHERE id = '0' ^ in /var/www/html/Insert.php:127 Stack 
trace: #0 /var/www/html/Insert.php(127): PDO->query('INSERT INTO spe...') #1 
{main} thrown in /var/www/html/Insert.php on line 127

修改后的查询是:

$sql = "INSERT INTO species (id,match,full_name)
VALUES ('".$var_id."','".$var_match ."','".$var_full_name."')".
"ON CONFLICT (id) DO UPDATE 
SET match = '".$var_match."',full_name = '".$var_full_name."' ". 
" WHERE id = '".$var_id."' ";

由于某种原因,它似乎仍然无法识别 ON CONFLICT (id) DO UPDATE SET。见图 有人能告诉我是我弄错了吗?提前致谢。

【问题讨论】:

    标签: php sql postgresql insert insert-update


    【解决方案1】:

    EXCLUDED.'".$var_match."' 会变成 EXCLUDED.'Escherichia coli''Escherichia coli'sure 之类的东西。

    任意使用

    $sql = "INSERT INTO species (id,match,full_name)
    VALUES ('".$var_id."','".$var_match ."','".$var_full_name."')".
    "ON CONFLICT (id) DO UPDATE 
    SET match = '".$var_match."',full_name = '".$var_full_name."' ";
    

    $sql = "INSERT INTO species (id,match,full_name)
    VALUES ('".$var_id."','".$var_match ."','".$var_full_name."')".
    "ON CONFLICT (id) DO UPDATE 
    SET match = EXCLUDED.match,full_name = EXCLUDED.full_name ";
    

    您可能还缺少UPDATEWHERE id = '".$var_id."'WHERE id = EXCLUDED.id

    【讨论】:

    • 当我使用上述功能时,我仍然得到一个错误。致命错误:未捕获的 PDOException:SQLSTATE[42702]:不明确的列:7 错误:列引用“id”不明确第 3 行:...richia coli',full_name = 'Escherichia coli' WHERE id = '0' ^ in /var /www/html//Insert.php:127 堆栈跟踪:#0 /var/www/html//Insert.php(127): PDO->query('INSERT INTO spe...') #1 {main}在第 127 行的 /var/www/html/Inser.php 中抛出
    • @Nemo:尝试验证idspecies.idexcluded.id,无论你是什么意思(我猜是 species.id?)。
    • @Nemo?值可能是。但那是另一回事了。在这里,DBMS 不知道您的意思是species.id 还是excluded.idid 都可能。这就是您需要对其进行限定的原因,以便 DBMS 知道您的意思。
    • 我试过了,但还是不行。所以我将查询拆分为,而不是使用 on 冲突。
    【解决方案2】:

    这是我找到的解决方案。我将查询拆分为因为 ON CONFLICT 不适合我。首先,我使用 select 通过检查 id 是否存在来确定行是否已经存在。如果 id 存在,则数据将更新。如果该想法不存在,则添加新行。

    功能

    function execute_query($query,$dbh){
        if ($dbh->query($query)) {
            return "New Record Inserted Successfully!<br \>\n";
        }else{
            return "Data not successfully Inserted.<br \>\n";
        } 
    } 
    

    选择和准备语句

    $query = 'SELECT * FROM species '. 'WHERE id = '. "'".$var_id."'";
    
    $stmt = $dbh->prepare($query);
    $stmt->execute();
    $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $out = $stmt->fetch();
    print_r($out) ;
    

    如果结果 => 更新行

    if ($out !== false){
        $sql = "UPDATE species SET id = '".$var_id."', match ='".$var_match."',full_name = '".$var_full_name."'
        WHERE id = '".$var_id."' ";
        echo $sql ."<br \>\n";;
        execute_query($sql,$dbh); # function
        echo "Value is updated";
    
    }else{ ### If no result => insert new values
        $sql = "INSERT INTO species (id,match,full_name)VALUES 
        ('".$var_id."','".$var_match ."','".$var_full_name."')";
        execute_query($sql,$dbh);
        echo "New value is inserted";
    

    【讨论】:

      猜你喜欢
      • 2021-04-05
      • 2017-09-24
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      相关资源
      最近更新 更多