2011-09-09 8 views
0

カラムの現在の値countProductSelectおよびcountProductInput - INTEGER NOT NULL;SQLiteで新しく作成されたカラムからデータを取得できません

INTEGER DEFAULT NULLを作成する必要があります。

下記のPHPコード。 「:countProductSelectTmpはそのような列」 -

問題は、そのエラーを取得し、時間欄とcountProductSelectTmp countProductInputTmpからのデータとcountProductSelect countProductInputを更新しようとしているではありません。

このエラーを処理するにはどうすればよいですか?あるいは、元の問題を解決するためのより高度なアルゴリズムがありますか? fine manualから

/** 
* Updating the database 
* 
* @return bool 
*/ 
protected function _updateDB() 
{ 
    $version = '3.8.4.0'; 

    $this->_pdo->exec(' 
     ALTER TABLE data ADD optionalCountProduct INTEGER DEFAULT NULL; 
     ALTER TABLE data ADD countProductSelectTmp INTEGER DEFAULT NULL; 
     ALTER TABLE data ADD countProductInputTmp INTEGER DEFAULT NULL; 
     UPDATE data SET countProductSelectTmp = countProductSelect, countProductInputTmp = countProductInput; 
    '); 

    $this->_deleteSQLiteColumn(array('countProductSelect', 'countProductInput')); 

    // BUG 
    // countProductSelect and countProductInput can not get the value countProductSelectTmp and countProductInputTmp 
    $this->_pdo->exec(' 
     ALTER TABLE data ADD countProductSelect INTEGER DEFAULT NULL; 
     ALTER TABLE data ADD countProductInput INTEGER DEFAULT NULL; 
     UPDATE data SET countProductSelect = countProductSelectTmp, countProductInput = countProductInputTmp; 
     UPDATE version SET id = "' . $version . '"; 
    '); 

    $this->_deleteSQLiteColumn(array('countProductSelectTmp', 'countProductInputTmp')); 

    return true; 
} 


/** 
* Remove column from a SQLite Table 
* 
* @param array $column name of the column to remove 
* @return bool 
*/ 
protected function _deleteSQLiteColumn(array $column) 
{ 
    return (bool)$this->_pdo->exec(' 
     BEGIN TRANSACTION; 
     CREATE TEMPORARY TABLE backup(' . $this->_getFullColumnsString() . '); 
     INSERT INTO backup SELECT ' . $this->_getShortColumnsString() . ' FROM data; 
     DROP TABLE data; 
     CREATE TABLE data(' . $this->_getFullColumnsString($column) . '); 
     INSERT INTO data SELECT ' . $this->_getShortColumnsString($column) . ' FROM backup; 
     DROP TABLE backup; 
     COMMIT; 
    '); 
} 

答えて

0

PDO :: exec - SQLステートメントを実行し、影響を受けた行

の数を返します。しかし、あなたは一度に複数のステートメントを実行しようとしていますおそらく最後の文を実行しているだけかもしれません。あなたの次の複数文execとあなたの_deleteSQLiteColumnで再び

$this->_pdo->exec('ALTER TABLE data ADD optionalCountProduct INTEGER DEFAULT NULL'); 
$this->_pdo->exec('ALTER TABLE data ADD countProductSelectTmp INTEGER DEFAULT NULL'); 
$this->_pdo->exec('ALTER TABLE data ADD countProductInputTmp INTEGER DEFAULT NULL'); 
$this->_pdo->exec('UPDATE data SET countProductSelectTmp = countProductSelect, countProductInputTmp = countProductInput'); 

そして:意図したとおりにexecを使用しようとすると、一度にあなたの文1を実行します。

NOT NULL拘束をドロップするだけですが、SQLite's ALTER TABLEが少し制限されているので、「テーブルのコピーを介して列をコピー、ドロップ列を追加する」アプローチが最適ですできるよ;例えば

、あなたは、列名「A」、「B」、および「C」とし、この表から列「c」を削除したいことを「T1」という名前のテーブルがあるとします。SQLite FAQから。次の手順は、これが行うことができる方法を示しています

BEGIN TRANSACTION; 
CREATE TEMPORARY TABLE t1_backup(a,b); 
INSERT INTO t1_backup SELECT a,b FROM t1; 
DROP TABLE t1; 
CREATE TABLE t1(a,b); 
INSERT INTO t1 SELECT a,b FROM t1_backup; 
DROP TABLE t1_backup; 
COMMIT; 
+0

問題が残りました。まだ助けが必要です。 – Gemorroj

+0

@ Gemorroj:新しいバージョンはどのように見えますか?私が朝に帰ったときに私は一見を持っています。 –

関連する問題