2011-11-28 56 views
-3

在MySQL 5.1和PHP 5.4中,我需要根據從數據庫上的查詢結果創建臨時表。問題是我需要在主服務器上創建臨時表(使用來自從服務器的數據)。這是選擇這個表的數據,它承載了所有的開銷,所以我需要SELECT在其中一個從機上進行。臨時表可以選擇長達2小時,我不能將它複製到所有的奴隸(至少我不認爲我可以)。在MySQL 5.1和PHP 5.4中使用slave的數據在master上創建表格

下面是代碼的樣子:

$database->executeQuery ("CREATE TABLE IF NOT EXISTS `" . $tableName . "` ENGINE = $engine CHARACTER SET utf8 (" . $sql . ") "); 

再次,在$ SQL變量查詢對奴隸的情況發生,同時在主服務器創建的表。

+0

不能跨兩個不同的mysql實例選擇數據庫。 – ajreal

+0

您可以使用聯邦表來使主數據上顯示從數據,但不知道$ sql應該是什麼,這可能會/可能不起作用。 –

+0

$ sql變量只是一個很長但正常的查詢。 – mylesmg

回答

0

好吧,原來我的方式是從奴隸抓取PHP的結果集,然後創建一個SQL語句將其插入到主。

public function createTemporaryTable ($tableName, $keyField = '', $sql = '', $engine = 'MEMORY') { 
    global $apdatabase; 
    $dbObj = new apdatabase(); 
    $dbObj->setSqlCache(false); 
    $dbObj->setSqlBigResult(true); 
    $dbObj->setSqlCalcFoundRows(false); 
    $dbObj->setResultMode(MYSQLI_USE_RESULT); 

    $sql = $sql ? $sql : $this->getQuery(); 
    $dbObj->executeQuery($sql); 
    $partsArr = array(); 
    $foundRows = false; 
    $resultArr = $dbObj->getResultArray(); 
    $dbObj->freeResultSet(); 
    if (! count($resultArr)) { 
     return; 
    } 
    /* 
    * Set up the statement we will use to create the table definition 
    */ 
    $firstRow = $resultArr[0]; 
    $fields = ''; 
    $fieldDefinitionStr = ''; 
    foreach ($firstRow as $field => $data) { 
     if ($fields != "") { 
      $fields .= ","; 
      $fieldDefinitionStr .= ","; 
     } 
     $fields .= $field; 
     $fieldDefinitionStr .= "`" . $field . "` VARCHAR (1024)"; 
    } 
    parent::executeQuery("DROP TABLE IF EXISTS `" . $tableName . "`"); 
    parent::executeQuery("CREATE TABLE `" . $tableName . "` (" . $fieldDefinitionStr . ") ENGINE = $engine CHARACTER SET utf8"); 

    /* 
    * Set up the sql to insert the remaining rows into our new table 
    */ 
    $sql = "INSERT IGNORE INTO `$tableName` ($fields) "; 
    $partsArr = array(); 
    foreach ($resultArr as $row) { 
     $foundRows = true; 
     $rowSql = "("; 
     foreach ($row as $field) { 
      if ($rowSql != "(") { 
       $rowSql .= ","; 
      } 
      $rowSql .= "'" . $field . "'"; 
     } 
     $rowSql .= ") "; 
     $partsArr[] = $rowSql; 
    } 
    parent::executeQuery($sql . "VALUES " . implode(', ', $partsArr)); 

    if ($keyField) { 
     parent::executeQuery(" ALTER TABLE `" . $tableName . "` ADD KEY (`" . $keyField . "`) "); 
    } 
} 
相關問題