9

当我插入一行时,它使用 SERIAL 递增 ID 字段。

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

(数据库是 Postgresql。)

4

5 回答 5

18
$db->Insert_ID();
于 2010-02-22T04:44:14.170 回答
7

此代码运行良好:

$insertId = $adodb->getOne("INSERT INTO test (str) values ('test') RETURNING id");
于 2013-04-08T11:40:15.060 回答
3

将您的 INSERT 视为 SELECT 并在您的 INSERT 查询中使用 RETURNING:

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

获取结果,你就完成了。从 8.2 版开始工作

于 2010-02-22T07:28:40.030 回答
2

Insert_ID() in adodb returns empty value or in some case it return 0.

The postgresql I worked on is in 9.1 version.

$_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: I have added a dirty way:

$_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.
于 2012-05-20T08:10:03.690 回答
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()

于 2018-04-15T19:01:53.293 回答