installation - SQL을 사용하지 않고 Magento 설치 스크립트에 auto_increment 열 추가




auto-increment (3)

이전에 SQL을 사용하지 않고 Magento 설치 스크립트에서 ALTER TABLE을 수행 하는 방법을 물었습니다. 거기서, Ivan 은 훌륭한 답을 주었는데, 나는 지금도 여전히 언급하고 있습니다.

그러나 나는 Varien_Db_Ddl_Table::addColumn() 을 사용하여 auto_increment 열을 지정하는 방법을 아직 발견하지 못했습니다. 나는 identity 이라는 옵션과 관련이 있다고 생각하지만 지금까지는 운이 없었습니다.

이것이 가능한가 또는 기능이 불완전한가?


Answers

하나는 자동 증가 열을 만들 수 있습니다 (적어도 Magento 1.6부터, 어쩌면 더 일찍) :

/** @var $table Varien_Db_Ddl_Table */
$table->addColumn( 'id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
    'auto_increment' => true,
    'unsigned' => true,
    'nullable' => false,
    'primary' => true,
), 'ID' );

"auto_increment"대신 "identity"키워드를 사용할 수도 있습니다.


나는 아직 구현되지 않은 무언가라고 생각한다.

addColumn 의 소스를 보면 identity/auto_increment 옵션을 찾고 내부 열 표현에 IDENTITY 속성을 설정하는 것을 볼 수 있습니다.

#File: lib/Varien/Db/Ddl/Table.php
if (!empty($options['identity']) || !empty($options['auto_increment'])) {
    $identity = true;
}

$upperName = strtoupper($name);
$this->_columns[$upperName] = array(
    'COLUMN_NAME'       => $name,
    'COLUMN_TYPE'       => $type,
    'COLUMN_POSITION'   => $position,
    'DATA_TYPE'         => $type,
    'DEFAULT'           => $default,
    'NULLABLE'          => $nullable,
    'LENGTH'            => $length,
    'SCALE'             => $scale,
    'PRECISION'         => $precision,
    'UNSIGNED'          => $unsigned,
    'PRIMARY'           => $primary,
    'PRIMARY_POSITION'  => $primaryPosition,
    'IDENTITY'          => $identity
);

그러나 연결 객체에서 createTable 메소드를 보면

#File: lib/Varien/Db/Adapter/Pdo/Mysql.php
public function createTable(Varien_Db_Ddl_Table $table)
{
    $sqlFragment    = array_merge(
        $this->_getColumnsDefinition($table),
        $this->_getIndexesDefinition($table),
        $this->_getForeignKeysDefinition($table)
    );
    $tableOptions   = $this->_getOptionsDefination($table);

    $sql = sprintf("CREATE TABLE %s (\n%s\n) %s",
        $this->quoteIdentifier($table->getName()),
        implode(",\n", $sqlFragment),
        implode(" ", $tableOptions));

    return $this->query($sql);
}

_getColumnsDefinition , _getIndexesDefinition_getForeignKeysDefinitionCREATE SQL 조각을 만드는 데 사용되는 것을 볼 수 있습니다. 이러한 메소드 중 어느 것도 identity 또는 auto_increment 대한 참조를 만들지 않으며 자동 증분을 생성하는 SQL을 생성하는 것으로 보이지 않습니다.

이 수업에서 유일한 후보자는

/**
 * Autoincrement for bind value
 *
 * @var int
 */
protected $_bindIncrement       = 0;

이는 PDO 바운드 매개 변수의 증가 수를 제어하는 ​​데 사용됩니다 ( auto_increment 와는 무관합니다).

여기에 auto_increment 대한 언급이 있습니다.

protected function _getOptionsDefination(Varien_Db_Ddl_Table $table)
{
    $definition = array();
    $tableProps = array(
        'type'              => 'ENGINE=%s',
        'checksum'          => 'CHECKSUM=%d',
        'auto_increment'    => 'AUTO_INCREMENT=%d',
        'avg_row_length'    => 'AVG_ROW_LENGTH=%d',
        'comment'           => 'COMMENT=\'%s\'',
        'max_rows'          => 'MAX_ROWS=%d',
        'min_rows'          => 'MIN_ROWS=%d',
        'delay_key_write'   => 'DELAY_KEY_WRITE=%d',
        'row_format'        => 'row_format=%s',
        'charset'           => 'charset=%s',
        'collate'           => 'COLLATE=%s'
    );
    foreach ($tableProps as $key => $mask) {
        $v = $table->getOption($key);
        if (!is_null($v)) {
            $definition[] = sprintf($mask, $v);
        }
    }

    return $definition;
}

그러나이 옵션은 테이블에 설정된 옵션을 처리하는 데 사용됩니다. 이 auto_incrementAUTO_INCREMENT 가 시작되는 정수를 제어하는 ​​데 사용할 수있는 AUTO_INCREMENT 테이블을 제어합니다.


auto_increment Constraint를 열 또는 MODIFY COLUMN에 추가하기 만하면됩니다.

 ALTER TABLE `emp` MODIFY COLUMN `id` INT NOT NULL UNIQUE AUTO_INCREMENT FIRST;

또는 먼저 열을 추가 한 다음 열을 -

1. Alter TABLE `emp` ADD COLUMN `id`;

2. ALTER TABLE `emp` CHANGE COLUMN `id` `Emp_id` INT NOT NULL UNIQUE AUTO_INCREMENT FIRST;