Я создаю простую систему управления складом в laravel 11. Когда я попытался перенести таблицы и назначить внешние ключи, я столкнулся с проблемой, связанной с неправильным ограничением внешнего ключа. Я попробовал файл миграции, полный текст ошибки приложен ниже.
Ошибка
SQLSTATE[HY000]: General error: 1005 Can't create table `dbwarehourse`.`order_products` (errno: 150 "Foreign key constraint is incorrectly formed") (Connection: mysql, SQL: alter table `order_products` add constraint `order_products_order_id_foreign` foreign key (`order_id`) references `orders` (`id`))
Таблица продуктов
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('productcode');
$table->foreignId('category_id')->constrained('categories');
$table->string('productname');
$table->decimal('price', 8, 2);
$table->integer('stock');
$table->integer('stock_level'); // Add this line
$table->boolean('status')->default(0);
$table->timestamps();
});
Стол заказов
Schema::create('orders', function (Blueprint $table) {
$table->id();
$table->interger('invoicenumber');
$table->foreignId('client_id')->constrained('clients');
$table->decimal('total_amount', 10, 2);
$table->boolean('status')->default(0);
$table->timestamps();
});
Заказ_продукты
Schema::create('order_products', function (Blueprint $table) {
$table->id();
$table->foreignId('product_id')->constrained('products');
$table->foreignId('order_id')->constrained('orders');
$table->integer('quantity');
$table->decimal('price', 8, 2);
$table->timestamps();
});
запустите SHOW ENGINE INNODB STATUS
и посмотрите раздел ПОСЛЕДНЯЯ ОШИБКА ВНЕШНЕГО КЛЮЧА
Ошибка, которую вы получаете, связана с назначением order_id
external_key в order_products
таблице.
Хотя синтаксис правильный, но все же могут возникнуть некоторые проблемы с соглашением об именах. Я также сталкивался с подобной ситуацией в своем собственном случае. И я нашел следующие решения полезными.
Поскольку ошибка говорит..
(ошибка: 150 «Ограничение внешнего ключа сформировано неправильно») (Соединение: mysql, SQL: изменить таблицу
order_products
добавить ограничениеorder_products_order_id_foreign
ссылки на внешний ключ (order_id
)orders
(id
))
Поэтому избегайте использования метода constrained()
и вместо этого явно определите Foreign Key Constraints
вот так в схеме Order_products
.
Schema::create('order_products', function (Blueprint $table) {
$table->id();
$table->foreignId('product_id')->constrained('products');
$table->unsignedBigInteger('order_id');
//define foreign key Constraint
$table->foreign('order_id')->references('id')->on('orders')->onDelete('cascade');
$table->integer('quantity');
$table->decimal('price', 8, 2);
$table->timestamps();
});
Попробуйте это, я думаю, это решит проблему. Если у вас возникнут какие-либо проблемы, дайте мне знать.
Сценарий 2 :-
Другая потенциальная причина этой ошибки заключается в том, что вы создали файл миграции order_products
до файла миграции orders
. В том случае, когда вы запускаете php artisan migrate
, происходит это столкновение. Потому что столбцы foreign-key
(в данном случае order_id
) таблицы Order_products
создаются до создания фактической таблицы orders
, на которую они ссылаются.
Если это так, вам необходимо поделиться ими с именем файла миграции. Только тогда мы сможем предложить вам правильные решения.
спасибооооооооооооооооооооооооооооооо.......... ......
Посмотрите внимательно на сообщение об ошибке. В частности, посмотрите на SQL, который он выдал.