Как реализовать автоматическое приращение в миграции Yii2 с помощью MySQL?

Я создал yii2 (v2.0.6) миграция для простого MySQL (v5.6.21) таблица. Все работает, за исключением того, что я не могу понять, как 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 создает длинный целочисленный тип данных и Я пытаюсь избежать этого. Любое понимание проблемы будет высоко оценено.

3 ответов


Если важно иметь этот тип столбца, вы всегда можете изменить его:

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

(Я тестировал это с MySQL - он работает)

однако, как говорит @scaisEdge, обычно это не стоит того.


почему не просто primaryKey?, формат для integer (8), integer (11) или primary key всегда один и тот же, всегда целочисленный тогда или вам нужен небольшой int (максимум 5 цифр), или вы можете использовать нормальный $this->primaryKey(), потому что

SMALLINT для хранения 2 байтов (значение -32768 32767), а затем smallInteger(8) не последовательны. число 8-это выход не для формата магазина. Если вы хотите 8 цифр, вам нужно по крайней мере INT 4 байт -2147483648 2147483647 или более


    $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');