妖怪幻 发表于 2016-11-19 06:51:18

PostgreSQL tips


[*]
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') RETURNINGid ";
$stmt= $dbh->query($sql);  // 注意是query而不是exec
// do错误检查
var_export($stmt->fetch(PDO::FETCH_ASSOC));

 第一条sql返回的是整个插入行,第二条返回是最后插入的整行,第三条返回指定的字段
[*]
直接对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的值真,多么的方便
[*]
PEAR::MDB2 对 PGSQL BOOL字段兼容性



mdb2 v1.x版本对于pgsql bool类型字段有兼容问题,获取的值居然是字符串'f'/'t'而不是期望的bool值或者数值0/1。 并且PHP自带的pgsql函数(pg_query())也有同样的问题。

解决办法就是使用PHP的PDO驱动。PDO_PGSQL可以正确处理bool字段值。




[*]
多列主键索引
 

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

  .
页: [1]
查看完整版本: PostgreSQL tips