2015-05-20 2 views
2

По какой-то причине система миграции не ведет себя хорошо с первичными ключами auto_increment. Я что-то наблюдаю? (Я использую Phalcon 2.0.1)auto_increment в системе миграции Phalcon

У меня есть следующие автогенерируемая миграция:

class LanguagesMigration_100 extends Migration 
{ 

public function up() 
{ 
    $this->morphTable(
     'languages', 
     array(
     'columns' => array(
      new Column(
       'id', 
       array(
        'type' => Column::TYPE_INTEGER, 
        'notNull' => true, 
        'autoIncrement' => true, 
        'size' => 11, 
        'first' => true 
       ) 
      ), 
      new Column(
       'ccode', 
       array(
        'type' => Column::TYPE_VARCHAR, 
        'notNull' => true, 
        'size' => 6, 
        'after' => 'id' 
       ) 
      ), 
      new Column(
       'active', 
       array(
        'type' => Column::TYPE_INTEGER, 
        'notNull' => true, 
        'size' => 1, 
        'after' => 'ccode' 
       ) 
      ) 
     ), 
     'indexes' => array(
      new Index('PRIMARY', array('id')), 
      new Index('UNIQ_A0D153794EE11504', array('ccode')) 
     ), 
     'options' => array(
      'TABLE_TYPE' => 'BASE TABLE', 
      'AUTO_INCREMENT' => '9', 
      'ENGINE' => 'InnoDB', 
      'TABLE_COLLATION' => 'utf8_unicode_ci' 
     ) 
    ) 
    ); 
} 
} 

Но когда я бегу, что миграция, сгенерированный SQL делает:

==> default: Phalcon DevTools (2.0.1) 
==> default: 1432127144.0475 
==> default: : 
==> default: SELECT IF(COUNT(*)>0, 1 , 0) FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_NAME`= 'languages' AND `TABLE_SCHEMA` = 'euromillions' 
==> default: => 
==> default: 1432127144.0619 
==> default: (
==> default: 0.014361143112183 
==> default:) 
==> default: 1432127144.0767 
==> default: : 
==> default: DESCRIBE `euromillions`.`languages` 
==> default: => 
==> default: 1432127144.1014 
==> default: (
==> default: 0.024682998657227 
==> default:) 
==> default: 1432127144.1033 
==> default: : 
==> default: ALTER TABLE `languages` MODIFY `id` INT(11) NOT NULL 
==> default: => 1432127144.1488 (0.045513153076172) 
==> default: 1432127144.1489: ALTER TABLE `languages` ADD `active` INT(1) NOT NULL AFTER ccode 
==> default: => 1432127144.17 (0.021080017089844) 
==> default: 1432127144.1701: SHOW INDEXES FROM `euromillions`.`languages` 
==> default: => 1432127144.1715 (0.001410961151123) 
==> default: 1432127144.1717: ALTER TABLE `languages` ADD INDEX `UNIQ_A0D153794EE11504` (`ccode`) 
==> default: => 1432127144.181 (0.0093460083007812) 
==> default: 1432127144.1811: ALTER TABLE `languages` DROP INDEX `ccode` 
==> default: => 1432127144.185 (0.0038588047027588) 
==> default: 1432127144.185: ALTER TABLE `languages` DROP INDEX `ccode_2` 
==> default: => 1432127144.1883 (0.0032830238342285) 
==> default:              
==> default: Success: Version 1.0.0 was successfully migrated 

Как вам можно увидеть, что поле id изменено, не включая auto_increment.

+0

Интересно. Просто для подтверждения, у вас есть это * Также рекомендуется установить PHP 5.4 или более. *? – Axalix

+0

php 5.6 установлен – antonienko

ответ

2

Я отвечаю на свой вопрос, так как кажется, что это ошибка в системе миграции Phalcon.

Как указывает @axalix, миграция выполняется на ранее существовавшей таблице. (Я поддержал ваш ответ, потому что это помогло мне добраться до решения).

Это исходная таблица:

CREATE TABLE `languages` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `ccode` varchar(6) COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `ccode` (`ccode`), 
    KEY `ccode_2` (`ccode`) 
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

И это модифицированная таблица (модифицируется Doctrine ORM: схема-инструмент)

CREATE TABLE `languages` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `ccode` varchar(6) COLLATE utf8_unicode_ci NOT NULL, 
    `active` tinyint(1) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `UNIQ_A0D153794EE11504` (`ccode`) 
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

Оказывается, что я забыл "без знака" вариант в объекте Doctrine, поэтому, когда таблицы были изменены, таблица выглядела как

CREATE TABLE `languages` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `ccode` varchar(6) COLLATE utf8_unicode_ci NOT NULL, 
    `active` tinyint(1) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `UNIQ_A0D153794EE11504` (`ccode`) 
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

Для этого я объяснил, что запуск миграции phalcon без опции unsigned заставил его забыть о auto_increment.

Я попытаюсь воспроизвести его в отдельности, чтобы сообщить об ошибке парням Phalcon.

1

Ну, когда я попытался выполнить миграцию, таблица была создана с помощью auto_increment. Но из ваших журналов я вижу, что таблица изменяется (не создается), что означает, что у вас уже была таблица, созданная ранее.

Больше чем это, вы не добавляете новый столбец id, но меняя его MODIFY id INT(11) NOT NULL. Так что же было раньше? varchars, не уникальные значения? Если это так, добавить флаг autoincrement просто невозможно.

+0

Стол был там (я делаю переход старого проекта к Phalcon). Единственное изменение в таблице - активный столбец (я добавил его). Раньше идентификатор столбца был INT (11) NOT NULL AUTO_INCREMENT – antonienko

+0

Насколько я понимаю, целью миграции является «перенос», чтобы применить перечисленные изменения (не описывать то, что у вас уже было). Если у вас уже есть столбец с надписью «NOT NULL AUTO_INCREMENT», нет необходимости добавлять новый блок столбцов с * 'autoIncrement' => true '*. – Axalix

+0

С другой стороны, если вы хотите иметь все миграции только для цели согласования, это нормально, но не ожидайте увидеть в журналах 'AUTO_INCREMENT', потому что он уже существует. Если вы хотите быть уверенным, что ваша миграция будет работать с пустой базой данных, просто попробуйте ее с пустой базой данных, и вы увидите, что она работает (я уже проверил ее для вас). – Axalix

Смежные вопросы