无法从SQLite中新创建的列中获取数据

时间:2011-09-09 11:01:05

标签: php sqlite pdo

列countProductSelect和countProductInput的当前值 - INTEGER NOT NULL;

需要使INTEGER DEFAULT为NULL;

下面的PHP代码。

问题是当尝试更新数据和countProductSelect countProductInput时,从time列和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;
    ');
}

1 个答案:

答案 0 :(得分: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;