2011-09-09 72 views
0

列的当前值countProductSelect和countProductInput - INTEGER NOT NULL;无法从SQLite中新创建的列中获取数据

需要使INTEGER DEFAULT NULL;

下面的PHP代码。

的问题是,当试图更新数据和countProductSelect countProductInput,从时间列和countProductSelectTmp countProductInputTmp,得到错误 - “没有这样的列:countProductSelectTmp”。

如何处理这个错误?或者也许有更多受过教育的算法来解决原始问题?

/** 
* 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

fine manual

PDO :: EXEC - 执行SQL语句并返回受影响的行

的数量,但你想在一次执行多个语句所以也许它只是执行最后的声明。使用exec按预期尝试和执行的语句一次一个:

$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和你_deleteSQLiteColumn

只要一个更好的方法,看起来你想要做的就是放弃NOT NULL约束,但SQLite's ALTER TABLE是有点限制,所以你的“添加列,复制列,通过表复制删除列”方法是最好的你可以做;从SQLite FAQ

例如,假设你有一个名为“T1”的列名“A”,“B”表,“C”,而你想从该表中删除列“C” 。以下步骤说明如何做到这一点:

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:你的新版本是什么样的?当我早上回来时,我会看看。 –