বিদেশী কী দিয়ে কলামটি ড্রপ করছে লারাভেল ত্রুটি: সাধারণ ত্রুটি: নতুন নামকরণে 1025 ত্রুটি


94

আমি এইভাবে মাইগ্রেশন ব্যবহার করে একটি সারণী তৈরি করেছি:

public function up()
{
    Schema::create('despatch_discrepancies',  function($table) {
        $table->increments('id')->unsigned();
        $table->integer('pick_id')->unsigned();
        $table->foreign('pick_id')->references('id')->on('picks');
        $table->integer('pick_detail_id')->unsigned();
        $table->foreign('pick_detail_id')->references('id')->on('pick_details');
        $table->integer('original_qty')->unsigned();
        $table->integer('shipped_qty')->unsigned();
    });
}

public function down()
{
    Schema::drop('despatch_discrepancies');
}

আমাকে এই টেবিলটি পরিবর্তন করতে হবে এবং বিদেশী কী উল্লেখ এবং কলামটি ছেড়ে দিতে pick_detail_idহবে এবং কলামের skuপরে ডাকা একটি নতুন ভারচর কলাম যুক্ত করতে হবে pick_id

সুতরাং, আমি অন্য একটি মাইগ্রেশন তৈরি করেছি, যা দেখতে এরকম দেখাচ্ছে:

public function up()
{
    Schema::table('despatch_discrepancies', function($table)
    {
        $table->dropForeign('pick_detail_id');
        $table->dropColumn('pick_detail_id');
        $table->string('sku', 20)->after('pick_id');
    });
}

public function down()
{
    Schema::table('despatch_discrepancies', function($table)
    {
        $table->integer('pick_detail_id')->unsigned();
        $table->foreign('pick_detail_id')->references('id')->on('pick_details');
        $table->dropColumn('sku');
    });
}

আমি যখন এই মাইগ্রেশন চালাচ্ছি তখন আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

[আলোকপাত করুন \ ডেটাবেস \ ক্যোরিএক্সেপশন]
এসকিউএলসেট [এইচওয়াই 2000]: সাধারণ ত্রুটি: 1025 './dev_iwms_reboot/despatch_discrepancies' থেকে './dev_iwms_reboot/#sql2-67c-17c464' (এররন: 152) সারণী (এলআরএলএল): despatch_discrepanciesবিদেশী কী পিক_ডেটেল_আইডি ড্রপ করুন)

[PDOException]
এসকিউএলসেট [HY000]: সাধারণ ত্রুটি: './dev_iwms_reboot/despatch_discrepancies' থেকে './dev_iwms_reboot/#sql2-67c-17c464' এর নাম পরিবর্তন (103)

php artisan migrate:rollbackকমান্ডটি চালিয়ে যখন আমি এই মাইগ্রেশনটি উল্টানোর চেষ্টা করি তখন আমি একটি Rolled backবার্তা পাই তবে এটি ডাটাবেসে আসলে কিছুই করছে না।

কোন ধারণা কি ভুল হতে পারে? বিদেশী কী উল্লেখ রয়েছে এমন কোনও কলাম আপনি কীভাবে ফেলেছেন?

উত্তর:


167

আপনি এটি ব্যবহার করতে পারেন:

$table->dropForeign(['pick_detail_id']);
$table->dropColumn('pick_detail_id');

আপনি যদি ড্রপফোরইন উত্সটিতে শীর্ষে যান, আপনি যদি অ্যারে হিসাবে কলামের নামটি পাস করেন তবে এটি আপনার জন্য বিদেশী কী সূচক নাম তৈরি করবে।


4
গৃহীত উত্তরটিও কার্যকর হয়: আপনাকে সঠিক সূচকের নাম কনভেনশনটি ব্যবহার করতে হবে। তবে এটি সেই উত্তরটির সাথেও সমস্যা: আপনাকে সূচীর নামকরণের স্কিমটি মনে রাখতে হবে, যখন এই সমাধানটি স্বয়ংক্রিয়ভাবে এটি করে! আমি সবসময় অন্যভাবে ব্যবহার করতাম এবং সর্বদা অভিযোগ করতাম যে এটি কতটা অপ্রচলিত ছিল। এখন আমি অবিলম্বে এই সমাধানে স্যুইচ করছি। আপনাকে অনেক ধন্যবাদ!
মার্কো প্যালানতে

6
দুর্দান্ত কৌশল আমি চুষে চুষার মতো দীর্ঘ পথ ধরে এটি করছি। লারাভেল ডক্সে সত্যিই কিছু সহায়তা ব্যবহার করতে পারে। আমি চ্যালেঞ্জটি নিতে পারি ...
সিমোনহ্যাম্প

4
লারাভেল 5.0-এ আমার জন্য কাজ করেছেন। অনেক ধন্যবাদ, অ্যালেক্স!
সিলিথক্রো

4
লারাভেল ৫.২ তে মোহন করার মতো কাজ করেছেন।
ronin1184

4
এটি একটি ঝরঝরে কৌশল। বিদেশী কী নামকরণ কনভেনশন (যা ভবিষ্যতে পরিবর্তিত হতে পারে) মনে রাখার চেয়ে বন্ধুবান্ধব। @ Ronin1184 এর মত বলেছিলেন, লারাভেল 5.2-এ পুরোপুরি কাজ করে
রবিন ভ্যান বালেন

81

দেখা যাচ্ছে; আপনি যখন এই জাতীয় একটি বিদেশী কী তৈরি করেন:

$table->integer('pick_detail_id')->unsigned();
$table->foreign('pick_detail_id')->references('id')->on('pick_details');

লারাভেল স্বতন্ত্রভাবে বিদেশী কী উল্লেখটির নাম দেয়:

<table_name>_<foreign_table_name>_<column_name>_foreign
despatch_discrepancies_pick_detail_id_foreign (in my case)

অতএব, যখন আপনি বিদেশী কী রেফারেন্স সহ একটি কলামটি ড্রপ করতে চান, আপনাকে এটি এইভাবে করতে হবে:

$table->dropForeign('despatch_discrepancies_pick_detail_id_foreign');
$table->dropColumn('pick_detail_id');

হালনাগাদ:

লারাভেল ৪.২+ একটি নতুন নামকরণের সম্মেলনটি প্রবর্তন করে:

<table_name>_<column_name>_foreign

4
লারাভেল ৪.২ এ কাজ করে না। <ফরেগইন_ট্যাবল_নাম> মূল নামের অংশ নয়। এটি কেবলমাত্র <টেবিল_নাম> _ <কলাম / নাম> _ফরাইভে কাজ করে।
সমৃদ্ধ পুনরায়

আমি এটি লার্যাভেল ৪.২ এ ব্যবহার করেছি এবং এখনও করছি, এটি আমার পক্ষে কাজ করে।
লাঠিসান

4
<table_name>_<column_name>_foreignকনভেনশন এখনো 5.1 জন্য কাজ বলে মনে হয়
ইয়াহিয়া উদ্দিন

স্পষ্টতই, সম্পর্কের প্রতিবন্ধকতা ফেলে দেওয়ার পরে, আপনাকে কলামটিও ছাড়তে হবে। আমি মনে করি ডকুমেন্টেশনটিও এতে অন্তর্ভুক্ত করা উচিত ছিল কারণ কেউ সহজেই ধরে নিতে পারে ড্রপফোরইনও কলামটি মুছে ফেলবে। ভাগ করে নেওয়ার জন্য ধন্যবাদ। laravel.com/docs/5.0/schema#dropping-colums
Picrasma

যদি কেউ ভাবছিলেন, কলামগুলি হয় তখন মাইএসকিউএল স্বয়ংক্রিয়ভাবে বিদেশী কীগুলির জন্য তৈরি সূচকগুলি বাদ দেওয়া হয়। এগুলি ম্যানুয়ালি দিয়ে ফেলে দেওয়ার দরকার নেই $table->dropIndex('column_name')
Aleksandar

24

আমার টেবিলে আমার একাধিক বিদেশী কী ছিল এবং তারপরে আমাকে ডাউন পদ্ধতিতে অ্যারের সূচক হিসাবে কলামের নাম দিয়ে একের পর এক বিদেশী কী বাধাগুলি সরিয়ে ফেলতে হয়েছিল:

public function up()
{
    Schema::table('offices', function (Blueprint $table) {
        $table->unsignedInteger('country_id')->nullable();
        $table->foreign('country_id')
            ->references('id')
            ->on('countries')
            ->onDelete('cascade');

        $table->unsignedInteger('stateprovince_id')->nullable();
        $table->foreign('stateprovince_id')
            ->references('id')
            ->on('stateprovince')
            ->onDelete('cascade');
        $table->unsignedInteger('city_id')->nullable();
        $table->foreign('city_id')
            ->references('id')
            ->on('cities')
            ->onDelete('cascade');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('offices', function (Blueprint $table) {
        $table->dropForeign(['country_id']);
        $table->dropForeign(['stateprovince_id']);
        $table->dropForeign(['city_id']);
        $table->dropColumn(['country_id','stateprovince_id','city_id']);
    });
} 

নীচের বিবৃতি ব্যবহার করে কাজ হয় না

$table->dropForeign(['country_id','stateprovince_id','city_id']); 

কারণ ড্রপফোরইগন সেগুলি পৃথক কলামগুলি সরিয়ে ফেলতে চাই না consider সুতরাং আমরা তাদের এক এক করে ফেলে দিতে হবে।


ধন্যবাদ আমার বন্ধু, অ্যারেতে কলামের নাম যুক্ত করা আমার পক্ষে কাজ করে।
পিয়েরে

যদি কেউ ভাবছিলেন, কলামগুলি হয় তখন মাইএসকিউএল স্বয়ংক্রিয়ভাবে বিদেশী কীগুলির জন্য তৈরি সূচকগুলি বাদ দেওয়া হয়। এগুলি ম্যানুয়ালি দিয়ে ফেলে দেওয়ার দরকার নেই $table->dropIndex('column_name')
Aleksandar

9

এটি সমাধানের মূল চাবিকাঠিটি আমার পক্ষে এটি নিশ্চিত করা ছিল যে $ টেবিল-> ড্রপফোরইন () কমান্ডটি সঠিক সম্পর্কের নামটি পাস করছিল, অগত্যা কলামের নাম নয়। আপনি কলামের নামটি পাস করতে চান না , যেমনটি আরও স্বজ্ঞাত আইএমএইচও হবে।

আমার জন্য যা কাজ করেছিল তা হ'ল:

$table->dropForeign('local_table_foreign_id_foreign');
$table->column('foreign_id');

সুতরাং আমি যে স্ট্রিংটি ড্রপফোরাইন () এ পৌঁছেছি তা আমার জন্য কাজ করেছিল যে বিন্যাসে ছিল:

[স্থানীয় সারণী] _ [বিদেশী কী ক্ষেত্র] _ফরাইওন করুন

আপনার যদি সিকোয়েল প্রো বা নাভিচ্যাটের মতো কোনও সরঞ্জামে অ্যাক্সেস থাকে তবে সেগুলি ভিজ্যুয়ালাইজ করতে সক্ষম হওয়া খুব সহায়ক হবে।


এটি ঠিকঠাক কাজ করে, @ অ্যালেক্সের পরামর্শ অনুসারে আমি বন্ধনীতে টেবিলের চারপাশের চেয়ে কম স্বজ্ঞাত বলে মনে করেছি।
কারওয়ানকে

5

আমার সাথে এমন কিছু ঘটেছিল যা আমি জানি না যে Schema::tableব্লকটি কোথায় রাখা হবে ।

পরে আমি আবিষ্কার করেছি যে কীটি এসকিউএল ত্রুটিতে রয়েছে:

[Illuminate\Database\QueryException]
SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails (SQL: drop table if exists `lu_benefits_categories`)

সুতরাং Schema::tableব্লক যেতে প্রয়োজন down()ফাংশন lu_benefits_categoriesমাইগ্রেশন আগে Schema::dropIfExistsলাইন:

public function down()
{
    Schema::table('table', function (Blueprint $table) {
        $table->dropForeign('table_category_id_foreign');
        $table->dropColumn('category_id');
    });
    Schema::dropIfExists('lu_benefits_categories');
}

এরপরে, কৌতুকটি করবেন php artisan migrate:refreshবা php artisan migrate:resetকরবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.