auto_increment 在 Phalcon 迁移系统中
auto_increment in Phalcon migrations system
出于某种原因,迁移系统在使用 auto_increment 主键时表现不佳。我在监督什么吗? (我使用的是 phalcon 2.0.1)
我有以下自动生成的迁移:
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。
好吧,当我尝试 运行 您的迁移时,table 是使用 auto_increment 创建的。但是我从你的日志中看到 table 正在被更改(而不是创建),这意味着你之前已经创建了一个 table。
不仅如此,您不是在添加新列 id
,而是在更改它 MODIFY id INT(11) NOT NULL
。那么之前有什么? varchars,非唯一值?如果是这样,就不可能添加 autoincrement
标志。
我正在回答我自己的问题,因为它似乎是 Phalcon 迁移系统中的一个错误。
正如@axalix 指出的那样,迁移是在 table 以前存在的基础上完成的。 (我赞成你的回答,因为它帮助我找到了解决方案)。
这是原文table:
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
这是修改后的table(由学说orm:schema-工具修改)
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实体中的"unsigned"选项,所以当tables被改变时,table看起来像
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 迁移使其忘记了 auto_increment。
我将尝试单独重现它以将错误报告给 Phalcon 人员。
出于某种原因,迁移系统在使用 auto_increment 主键时表现不佳。我在监督什么吗? (我使用的是 phalcon 2.0.1)
我有以下自动生成的迁移:
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。
好吧,当我尝试 运行 您的迁移时,table 是使用 auto_increment 创建的。但是我从你的日志中看到 table 正在被更改(而不是创建),这意味着你之前已经创建了一个 table。
不仅如此,您不是在添加新列 id
,而是在更改它 MODIFY id INT(11) NOT NULL
。那么之前有什么? varchars,非唯一值?如果是这样,就不可能添加 autoincrement
标志。
我正在回答我自己的问题,因为它似乎是 Phalcon 迁移系统中的一个错误。
正如@axalix 指出的那样,迁移是在 table 以前存在的基础上完成的。 (我赞成你的回答,因为它帮助我找到了解决方案)。
这是原文table:
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
这是修改后的table(由学说orm:schema-工具修改)
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实体中的"unsigned"选项,所以当tables被改变时,table看起来像
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 迁移使其忘记了 auto_increment。
我将尝试单独重现它以将错误报告给 Phalcon 人员。