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上建立單獨索引。


 

 

 

 

 

 

 

 

 

 

 

.

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