使用Adodb进行php/postgresql开发,在插入数据后返回行ID

9

当我插入一行数据时,它会使用SERIAL自动递增ID字段。

如何在插入后立即返回新创建的ID号码?

(数据库是Postgresql。)


注:SERIAL是PostgreSQL中的一种数据类型,用于自动生成递增的数字。
5个回答

18
$db->Insert_ID();

7
这段代码运行良好:
$insertId = $adodb->getOne("INSERT INTO test (str) values ('test') RETURNING id");

3

将您的INSERT查询与SELECT相同,并在其中使用RETURNING:

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

获取结果即可完成操作。此方法适用于8.2版本及以上。


2

adodb中的Insert_ID()函数返回空值或在某些情况下返回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.

编辑: 我已经添加了一种不太正式的方式:

$_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

我喜欢使用adodb来避免编写SQL。我需要在table1中插入一个记录,其中包含text1,同时在table2中插入其他数据和在table1上创建的ID作为参考。我喜欢使用事务和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() 的选项


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接