Новые и старые значения в postgresql php - PullRequest
0 голосов
/ 28 мая 2018

У меня есть таблица, содержащая много данных.В этой таблице я хотел бы добавить новые и обновить старые значения.Поэтому я нашел следующий метод

После адаптации запроса из ответа я все равно получил ошибку.

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.Смотрите картинку enter image description here Может кто-нибудь сказать мне, если я ошибся?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Это решение, которое я нашел.Я разделил запрос на, потому что ON CONFLICT не работал для меня.Сначала я использую select, чтобы определить, существует ли строка, проверив, присутствует ли 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";
0 голосов
/ 28 мая 2018

EXCLUDED.'".$var_match."' станет чем-то вроде EXCLUDED.'Escherichia coli' и 'Escherichia coli', конечно, не столбец.

Либо используйте

$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 ";

И вам, вероятно, также не хватает WHERE id = '".$var_id."' или WHERE id = EXCLUDED.id для UPDATE.

...