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上建立单独索引。


 

 

 

 

 

 

 

 

 

 

 

.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值