2011-09-09 3 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 :: 간부 - 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와 함께.

더 좋은 방법은제약 조건을 없애고 싶지만 SQLite's ALTER TABLE은 약간 제한되어 있으므로 "테이블 복사를 통해 열을 복사하고 열을 추가하십시오"접근 방식이 가장 좋습니다. 넌 할 수있어; SQLite FAQ에서 : 예를 들어

, 당신이 "A"열 이름 "T1", "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 : 새 버전은 어떻게 생겼습니까? 나는 아침에 돌아 왔을 때 모습을 보일거야. –

관련 문제