行を挿入すると、SERIALを使用してIDフィールドがインクリメントされます。
挿入直後に新しく作成したID番号を返すにはどうすればよいですか?
(データベースはPostgresqlです。)
行を挿入すると、SERIALを使用してIDフィールドがインクリメントされます。
挿入直後に新しく作成したID番号を返すにはどうすればよいですか?
(データベースはPostgresqlです。)
$db->Insert_ID();
このコードはうまく機能します:
$insertId = $adodb->getOne("INSERT INTO test (str) values ('test') RETURNING id");
INSERTをSELECTと同じように扱い、INSERTクエリでRETURNINGを使用します。
INSERT INTO foo(bar)VALUES('Doe')RETURNING id;
結果を取得すれば完了です。バージョン8.2以降で動作します
Insert_ID()
inadodb
は空の値を返すか、場合によっては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に他のデータを含むレコードを挿入し、テーブル1に作成された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()