PostgreSQL tips

  1. PHP PDO获取lastInsertId
    PHP手册对于PDO::lastInsertId 函数的注解是
    string PDO::lastInsertId ([ string $name = NULL ] )

    Returns the ID of the last inserted row, or the last value from a sequence object, depending on the underlying driver. For example, PDO_PGSQL() requires you to specify the name of a sequence object for the name parameter
     

    就是说对于pgsql必须指定sequence值,比如

    $val = $dbh->lastInserId('table_id_seq');
     


    如果不指定seq值则得不到正确值。解决办法是使用pgsql对'insert'扩展的语法

    $sql	= "insert into test1 (id, s) values (default, 'a') RETURNING  *";
    $sql2 = "insert into test1 (id, s) values (default, 'a'),  (default, 'b') RETURNING  * ";
    $sql3 = "insert into test1 (s) values ('a'), ('b') RETURNING  id ";
    
    $stmt	= $dbh->query($sql);  // 注意是query而不是exec
    // do错误检查
    
    var_export($stmt->fetch(PDO::FETCH_ASSOC));
    
     第一条sql返回的是整个插入行,第二条返回是最后插入的整行,第三条返回指定的字段


  2. 直接对PDOStatement结果进行迭代

    一般情况我们对query出来的结果需要先fetchAll然后再迭代,比如
    $sql  = 'SELECT * FROM users';
    $stmt = $dbh->query($sql, PDO::FETCH_ASSOC);
    // .. do err check
    $res = $stmt->fetchAll();
    if ($res) {
        foreach ($res as $row ) {
            // .. do something
            $uid = $row['userid'];
        }
    }
     
    PHP5的foreach可以对Object进行迭代处理,于是可以这样:
    $sql  = 'SELECT * FROM users';
    $stmt = $dbh->query($sql, PDO::FETCH_ASSOC);
    // .. do err check
    foreach ($stmt as $row ) {  // 注意是$stmt 而不是 $stmt->fetchAll()
            // .. do something
            $uid = $row['userid'];
    }
    
    
      并且不用额外判断$stmt的值真,多么的方便


  3. PEAR::MDB2 对 PGSQL BOOL字段兼容性

    mdb2 v1.x版本对于pgsql bool类型字段有兼容问题,获取的值居然是字符串'f'/'t'而不是期望的bool值或者数值0/1。 并且PHP自带的pgsql函数(pg_query())也有同样的问题。
    解决办法就是使用PHP的PDO驱动。PDO_PGSQL可以正确处理bool字段值。


  4. 多列主键索引  
    多列主键顺序与创建 Primary key (col1, col2) 时顺序有关。对col2单独搜索时“=”将会使用主键索引,其他比较操作符将无法使用主键索引;如果同时也对col1进行条件搜索,则对col2使用同样策略无论col1的比较符是什么。所以建表使用多列主键时需要考虑搜索环境来设定主键顺序,以及根据搜索col2的频率考虑是否在col2上建立单独索引。


 

 

 

 

 

 

 

 

 

 

 

.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章