当我插入一行数据时,它会使用SERIAL自动递增ID字段。
如何在插入后立即返回新创建的ID号码?
(数据库是Postgresql。)
注:SERIAL是PostgreSQL中的一种数据类型,用于自动生成递增的数字。
当我插入一行数据时,它会使用SERIAL自动递增ID字段。
如何在插入后立即返回新创建的ID号码?
(数据库是Postgresql。)
$db->Insert_ID();
$insertId = $adodb->getOne("INSERT INTO test (str) values ('test') RETURNING id");
将您的INSERT查询与SELECT相同,并在其中使用RETURNING:
INSERT INTO foo (bar) VALUES('Doe') RETURNING id;
获取结果即可完成操作。此方法适用于8.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.
我喜欢使用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()
的选项