【问题标题】:Get last inserted id in oracle with php使用php在oracle中获取最后插入的id
【发布时间】:2019-10-28 05:36:02
【问题描述】:

我有两个用这个创建的表:

CREATE TABLE t1 (id NUMBER GENERATED AS IDENTITY);
CREATE TABLE t2 (id NUMBER GENERATED AS IDENTITY);

我将一些数据插入到 t1 中,然后我需要将该插入中生成的 ID 插入到 t2 中。

例如:

"insert into t1 (name, description) values ('asd','dsa')"
**getting that autogenerated ID
"insert into t2 (idFromt1,name) values (idFromt1,'sarasa')"

我看到很多这样的例子:

"insert into t1 (name, description) values ('asd','dsa') returning ID into inserted_id";

但我不能/不知道如何从 php 中检索“inserted_id”变量以进行第二次插入。

【问题讨论】:

标签: php oracle


【解决方案1】:

您可以(应该?)使用returning 值。

例如,使用 PDO:

$query = "insert into t1 (name, description) values ('asd','dsa') returning ID";

$stmt = $pdo->query($query);

$id = $stmt->fetchColumn();

【讨论】:

    【解决方案2】:

    我在谷歌上搜索了 PDO 并进入了这个:

    $qry="INSERT INTO t1 (NOMBRE) VALUES ('sarasa') returning ID into :inserted_id";
    
    $parsed = oci_parse($this->conn, $qry);
    
    oci_bind_by_name($parsed, ":inserted_id", $idNumber,32);
    oci_execute($parsed);
    echo $idNumber;
    

    所以我假设 oci_bind_by_name 只是一个方向,但不是。 这将生成的 id 保存到变量 $idNumber 中,这正是我所需要的。谢谢大家的回答。

    【讨论】:

      【解决方案3】:

      使用PDO::lastInsertID

      例子:

      $stmt = $db->prepare("...");
      $stmt->execute();
      $id = $db->lastInsertId();
      

      不要使用

      SELECT MAX(id) FROM table;
      

      因为如果在 select 之前执行其他一些插入查询是不安全的,并且它在事务中对您不起作用。

      【讨论】:

        【解决方案4】:

        这个问题是关于 PHP 使用 PDO 和 Oracle。这些解决方案都不适合我,Emepese 的答案使用原生 OCI 驱动程序而不是 PDO,并且 PDO::lastInsertId 不适用于 Oracle。

        Cid 的回答让我最接近,还有来自 how to get sequence id of last inserted record in oracle 11g xe with php? 的回答

        但我的情况有点复杂。我已经对$stmt->prepare($query)$stmt->execute(array('name'=>$name, 'desc'=>$desc)); 进行了查询,为了让它工作,我写了这个:

        $query = "insert into t1 (name, desc) values (:name, :desc) returning ID into :PK_ID";
        // move params to an array:
        $params = array('name'=>$name, 'desc'=>$desc);
        foreach ($params as $key=>$value){
              $stmt->bindValue($key,$value);
        }
        $stmt->bindParam('PK_ID',$id,PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT,32);
        // Important! Remove all parameters from the execute command:
        $stmt->execute();
        // insert id is now in the $id variable - do something with it
        echo "I inserted $id!";
        

        我希望这可以帮助其他人节省尝试使用标识列、Oracle 序列和绑定参数的时间。

        【讨论】:

          【解决方案5】:

          要么使用PDO::lastInsertId

          SELECT MAX(id) FROM table;
          

          【讨论】:

          • MAX(id) 是个糟糕的主意。这取决于种族
          猜你喜欢
          • 2016-11-25
          • 1970-01-01
          • 2011-06-24
          • 2011-09-23
          • 2011-03-09
          • 1970-01-01
          • 2013-07-28
          • 1970-01-01
          • 2013-07-01
          相关资源
          最近更新 更多