Миграции не выполняются из-за того, что ПЕРВИЧНОМУ КЛЮЧУ присвоено значение NULL?

#php #laravel #migration

#php #laravel #миграция

Вопрос:

Я выполнял миграции для своей базы данных в Laravel, но эта ошибка продолжает появляться. Я думал, что исправил это, но нет. Ошибка гласит:

SQLSTATE[42000]: синтаксическая ошибка или нарушение доступа: 1171 Все части ПЕРВИЧНОГО КЛЮЧА должны быть НЕ НУЛЕВЫМИ; если вам нужно значение NULL в ключе, используйте UNIQUE вместо этого

SQLSTATE[42000]: синтаксическая ошибка или нарушение доступа: 1171 Все части ПЕРВИЧНОГО КЛЮЧА должны быть НЕ нулевыми; если вам нужно значение NULL в ключе, используйте UNIQUE вместо этого (SQL: создайте
таблицу e articulos ( id bigint без знака не null, descuento_id bigint без знака не null, unidad_medida varchar(40) не null, categoria varchar(50) nul
l, nombre varchar(100) не null, codigo_comercial varchar(50) null, codigo_interno varchar(35) null, tipo перечисление (‘interno’, ‘externo’) не null по умолчанию
‘externo’, marca varchar(50) null, existencia double(8, 2) не null по умолчанию ‘0’, status перечисление(‘activo’, ‘suspendido’) не null по умолчанию ‘activo’, stock
tinyint null автоматически увеличивает первичный ключ, descripcion текст null, max int null, min int null, codigo_producto_sat varchar(255) null, codigo_unidad_sat
тип varchar(255) значение null, subcategoria имя varchar(50) null, то subsubcategoria имя varchar(50) null, то modelo имя varchar(255) null, то presentaciones значение null в JSON, imagen varc
Хар(255) null, в impuestos_compra формате JSON не нуль, impuestos_venta не равен NULL в JSON, validar_peso перечисление(‘си’: ‘нет’) не null по умолчанию «нет», deleted_at timestam
Р нуль, created_at нуль метку, updated_at метку времени, значение null) набор символов по умолчанию utf8mb4 предложение COLLATE ‘utf8mb4_unicode_ci’)

Мой файл миграции:

 Schema::create('articulos', function (Blueprint $table) {
        $table->unsignedBigInteger('id');
        $table->unsignedBigInteger('descuento_id');
        $table->string('categoria' , 50)->nullable();
        $table->string('nombre' , 100);
        $table->string('codigo_comercial' , 50)->unique()->nullable();
        $table->string('codigo_interno' , 35)->nullable();
        $table->enum('tipo' , ['interno' , 'externo'])->default('externo');
        $table->string('marca' , 50)->nullable();
        $table->double('existencia' , 8 , 2)->default('0');
        $table->enum('status' , ['activo' , 'suspendido'])->default('activo');
        $table->tinyInteger('stock' , 1)->nullable();
        $table->text('descripcion')->nullable();
        $table->integer('max')->nullable();
        $table->integer('min')->nullable();
        $table->string('unidad_medida' , 40);
        $table->string('codigo_producto_sat' , 255)->nullable();
        $table->string('codigo_unidad_sat' , 255)->nullable();
        $table->string('subcategoria' , 50)->nullable();
        $table->string('subsubcategoria', 50)->nullable();
        $table->string('modelo' , 255)->nullable();
        $table->json('presentaciones')->nullable();
        $table->string('imagen' , 255)->nullable();
        $table->json('impuestos_compra');
        $table->json('impuestos_venta');
        $table->enum('validar_peso' , ['si' , 'no'])->default('no');
        $table->softDeletes();
        $table->timestamps();
  

Спасибо, что помогли мне!

Ответ №1:

Если я чего-то не упускаю, я не вижу в этой миграции ничего, что явно устанавливало бы первичный ключ. Я бы рекомендовал использовать $table->bigIncrements('id'); вместо $table->unsignedBigInteger('id'); для этого, это может решить вашу проблему, но я не уверен на 100%. Есть ли еще какая-либо информация в ошибке, которая показывает, что sql генерируется при миграции? Это бы очень помогло!

Комментарии:

1. Привет! Я только что добавил сообщение о запросе, отображаемое в ошибке.

2. или просто $table->id(); . $table->bigIncrements('id'); является псевдонимом $table->id()

Ответ №2:

Я только что исправил это. TinyInt не должен быть обнуляемым:

 $table->tinyInteger('stock' , 1)->nullable();
  

Вместо этого я должен ввести следующее:

 $table->tinyInteger('stock' , 1);
  

Спасибо.

Комментарии:

1. так stock ваше поле автоматического увеличения, не id ? вторым аргументом для целочисленных полей является a bool и это для autoincrement … не уверен, почему вы не сделали бы id автоматическое увеличение поля, поскольку это идентификатор (следовательно, ‘id’)