Используя Adodb для php / postgresql, вернуть идентификатор строки после вставки - PullRequest
9 голосов
/ 22 февраля 2010

Когда я вставляю строку, она увеличивает поле идентификатора с помощью SERIAL.

Как я могу вернуть вновь созданный идентификационный номер сразу после вставки?

(База данных Postgresql.)

Ответы [ 5 ]

18 голосов
/ 22 февраля 2010
$db->Insert_ID();
7 голосов
/ 08 апреля 2013

Этот код прекрасно работает:

$insertId = $adodb->getOne("INSERT INTO test (str) values ('test') RETURNING id");
3 голосов
/ 22 февраля 2010

Обращайтесь со своим INSERT так же, как с SELECT, и используйте RETURNING в вашем INSERT-запросе:

INSERT INTO foo (bar) VALUES ('Doe') RETURNING id;

Получите результат, и все готово. Работает с версии 8.2

2 голосов
/ 20 мая 2012

Insert_ID() in adodb возвращает пустое значение или в некоторых случаях возвращает 0.

postgresql, над которым я работал, находится в версии 9.1.

$_sql = 'INSERT INTO '.$_table.' (';
$_sql .= implode(', ',$arr_fld_names);
$_sql .= ") VALUES ('";
$_sql .= implode("', '",$arr_fld_values);
$_sql .= "')";

if ($echo){
    echo $_sql;
}

$_return = $this->Execute($_sql);
$this->mLastInsertedId = $this->mConn->Insert_ID(); // Keep track of the last inserted ID.

Edit: Я добавил грязный способ:

$_sql = 'INSERT INTO '.$_table.' (';
$_sql .= implode(', ',$arr_fld_names);
$_sql .= ") VALUES ('";
$_sql .= implode("', '",$arr_fld_values);
$_sql .= "') RETURNING id";

if ($echo){
    echo $_sql;
}

$_return = $this->Execute($_sql);
preg_match_all('/([\d]+)/', $_return, $ret_val);
$this->mLastInsertedId = $ret_val[0][0]; // Keep track of the last inserted ID.
0 голосов
/ 15 апреля 2018

Мне нравится использовать adodb, чтобы избежать написания SQL. Мне нужно вставить запись в table1 с text1 и одновременно запись в table2 с другими данными и созданным идентификатором в table1 в качестве ссылки. Мне нравится идея использования транзакции и AutoExecute

$db->StartTrans();
{
    $array_table1 = array('text_field'=>'text1');
    $db->AutoExecute("table1", $array_table1, 'INSERT');

    if ($lastid=$db->Insert_ID()) {
        $array_table2=array(
            'text_field'=>'other text',
            'id_of_table1'=>$lastid);
        $db->AutoExecute('other_table', $array_table2, 'INSERT');
    } else {
        $db->RollbackTrans();
    }

}
$db->CompleteTrans();
$result=$db->_transOK;

Autoexecute все еще не хватает опции для возврата Insert_Id()

...