如何在使用MySQL的Yii2迁移中实现AUTO_INCREMENT?

时间:2015-12-06 11:45:08

标签: php mysql yii2

我为一个简单的MySQL(v5.6.21)表创建了一个yii2(v2.0.6)迁移。一切正常,除了我无法弄清楚如何AUTO_INCREMENT主键。问题似乎是我使用的是小整数而不是更标准的长整数数据类型。这是我的迁移代码:

$this->createTable('{{%status}}', [
    'id' =>          $this->smallInteger(8)->unique(),
    //'id' =>        $this->primaryKey(11),
    'description' => $this->string(20),
]);

$this->addPrimaryKey('','status','id');

我可以通过使用 - > primaryKey()方法来解决这个问题,该方法在上面的第3行中被注释掉,但是然后yii创建了一个长整数数据类型,我试图避免这种情况。任何对这个问题的见解都将非常感激。

5 个答案:

答案 0 :(得分:8)

如果拥有该列类型至关重要,您可以随时更改它:

$this->createTable('{{%status}}', [
    'id'          => $this->primaryKey(11),
    'description' => $this->string(20),
]);
$this->alterColumn('{{%status}}', 'id', $this->smallInteger(8).' NOT NULL AUTO_INCREMENT');

(我已经用MySQL测试了它 - 它有效)

然而,就像@scaisEdge所说,它通常不值得这么做。

答案 1 :(得分:2)

为什么不是简单的primaryKey ?,整数(8),整数(11)或主键的格式总是相同的,总是一个整数长 那么或者你需要一个小的int(最多5位数)或者你可以使用正常的$this->primaryKey(),因为

SMALLINT用于存储2字节(值-32768 32767) smallInteger(8)不一致。数字8用于输出而不是商店格式。如果你想要8位数,至少需要 INT为4字节-2147483648 2147483647或更高

答案 2 :(得分:0)

    $this->createTable('posts', [

        'post_id' => "bigint(20) unsigned NOT NULL AUTO_INCREMENT",

        'loc_id' => $this->integer(10)->unsigned()->notNull(),

        "PRIMARY KEY (`post_id`,`loc_id`)",

    ], 'ENGINE=InnoDB DEFAULT CHARSET=utf8');

答案 3 :(得分:0)

这对我有用

$this->createTable('new_table',[
        'id' => Schema::TYPE_PK.' NOT NULL AUTO_INCREMENT',
        'name' => Schema::TYPE_STRING,
        'age' => Schema::TYPE_INTEGER
    ]);

但是,您可以简单地使用以下样式,并且 Yii 将根据您的DBMS替换ID的'pk'类型。对于MYSQL,它将为 int(11)NOT NULL AUTO_INCREMENT PRIMARY KEY

$this->createTable('new_table',[
        'id' => 'pk',
        'name' => Schema::TYPE_STRING,
        'age' => Schema::TYPE_INTEGER
    ]);

答案 4 :(得分:0)

另一种(更易读)的方法是:

$this
    ->integer()
    ->unsigned()
    ->notNull()
    ->append('AUTO_INCREMENT');